测试替身,也称为模拟、存根或伪造,用于测试中用模拟的依赖项替换真实的依赖项,以隔离正在测试的代码。Nightwatch 通过其模拟命令提供对测试替身的支持,该命令允许您为依赖项创建存根和模拟。

安装

1) 从 NPM 安装插件
npm i @nightwatch/testdoubles --save-dev
2) 添加配置

编辑您的 nightwatch.json (或 nightwatch.conf.js) 文件并添加以下内容

nightwatch.conf.js
module.exports = {
  plugins: ['@nightwatch/testdoubles']

  // other Nightwatch settings...
}
3) 禁用浏览器会话

我们还需要关闭浏览器会话,因为我们只执行单元测试。这可以通过设置以下属性来完成

nightwatch.conf.js
module.exports = {
  // ....
  testdoubles: {
    start_session: false,
    webdriver: {
      start_process: false,
    }
  }
}

需要 Nightwatch 2.6.4 或更高版本。

用法

一旦安装了 @nightwatch/testdoubles 并将其添加到您的配置文件中,您就可以在测试用例中使用 sinon 对象来创建测试替身。以下是一些示例

间谍

间谍是一个函数,它记录其调用的一些元数据,例如调用次数、调用时使用的参数等。间谍有助于验证是否调用了函数,或检查调用时使用的参数。

spy.js

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 函数。断言检查间谍是否被调用了一次。最后,间谍将恢复到其原始状态。

存根

存根是一个函数,它用“虚拟”实现替换原始函数。当您需要在测试期间控制函数的行为时,这很有用,例如模拟错误条件。

stub.js
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() 运行检查并在检查失败时报告错误。

mock.js

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_sessionwebdriver -> start_process 设置为 false

npx nightwatch <path to tests> --env testdoubles

我们希望这些示例可以帮助您开始在 Nightwatch 测试中使用 @nightwatch/testdoubles