Nightwatch 中的测试替身
测试替身,也称为模拟、存根或伪造,用于测试中用模拟的依赖项替换真实的依赖项,以隔离正在测试的代码。Nightwatch 通过其模拟命令提供对测试替身的支持,该命令允许您为依赖项创建存根和模拟。
安装
1) 从 NPM 安装插件
npm i @nightwatch/testdoubles --save-dev
2) 添加配置
编辑您的 nightwatch.json
(或 nightwatch.conf.js
) 文件并添加以下内容
module.exports = {
plugins: ['@nightwatch/testdoubles']
// other Nightwatch settings...
}
3) 禁用浏览器会话
我们还需要关闭浏览器会话,因为我们只执行单元测试。这可以通过设置以下属性来完成
module.exports = {
// ....
testdoubles: {
start_session: false,
webdriver: {
start_process: false,
}
}
}
需要 Nightwatch 2.6.4 或更高版本。
用法
一旦安装了 @nightwatch/testdoubles
并将其添加到您的配置文件中,您就可以在测试用例中使用 sinon 对象来创建测试替身。以下是一些示例
间谍
间谍是一个函数,它记录其调用的一些元数据,例如调用次数、调用时使用的参数等。间谍有助于验证是否调用了函数,或检查调用时使用的参数。
describe('use spies in nightwatch', function() {
it('should log message when called', function({sinon}) {
const obj = {
hello: () => console.log('Hello!')
}
const sayHello = () => obj.hello();
const spy = sinon.spy(obj, 'hello'); // create a spy on hello
sayHello();
assert(spy.calledOnce); // assert that the spy was called once
spy.restore(); // restore original hello function
})
})
此示例在对象的 hello 方法上创建了一个间谍,然后调用了 sayHello
函数。断言检查间谍是否被调用了一次。最后,间谍将恢复到其原始状态。
存根
存根是一个函数,它用“虚拟”实现替换原始函数。当您需要在测试期间控制函数的行为时,这很有用,例如模拟错误条件。
describe('use stubs in nightwatch', function() {
it('stub hello', function({sinon}) {
const obj = {
hello: () => console.log('Hello!')
}
const sayHello = () => obj.hello();
const stub = sinon.stub(obj, 'hello').returns('hi'); // replace hello with a dummy implementation that returns 'hi'
const result = sayHello();
assert.strictEqual(result, 'hi'); // check that the stubbed function returned 'hi'
});
});
此示例在 console.log 方法上创建了一个存根,然后用参数 'Hello!' 调用它。断言检查存根是否用预期参数调用了一次。最后,存根将恢复到其原始状态。
模拟
模拟是一个函数,它“模拟”一个对象,即它创建一个与真实对象具有相同接口的假对象。您可以对模拟对象设置期望,即指定哪些方法应该被调用以及使用哪些参数,模拟将验证这些期望在测试期间是否得到满足。
自动创建模拟会附加一个 Nightwatch 断言到它。mock.verify() 运行检查并在检查失败时报告错误。
describe('use mocks in nightwatch', function() {
it('mock hello obj', function({sinon}) {
const obj = {
hello: () => console.log('Hello!')
}
const sayHello = () => obj.hello();
const mock = sinon.mock(obj).expects('hello').atLeast(1).returns(null); //set a mock on hello
sayHello();
mock.verify(); // mocks comes with inbuilt assertion
})
})
此示例在对象的 hello 方法上创建了一个模拟,然后调用了 sayHello 函数。mock.verify() 方法检查模拟是否至少被调用了一次。最后,模拟将恢复到其原始状态。
有关如何使用间谍、存根和模拟的更多信息,请参阅 Sinon.js 文档。
运行 API 测试
确保 API 测试针对 environment
运行,其中 start_session
和 webdriver -> start_process
设置为 false
。
npx nightwatch <path to tests> --env testdoubles
我们希望这些示例可以帮助您开始在 Nightwatch 测试中使用 @nightwatch/testdoubles
!