如何使用 nightwatch.js 和 sinon.js 的假计时器?
How to use Fake timers with nightwatch.js and sinon.js?
我正在用 nightwatch.js 做 JavaScript e2e 测试,我想用 sinon.js 的假计时器模拟时钟 http://sinonjs.org/docs/#clock
但是测试在完成之前停止了,我得到了如下日志,并且不再进行了。
[some test] Test Suite
===============================
✔ Element <body> was visible after 5000 milliseconds.
我的测试代码如下。我该如何解决这个问题?谢谢。
module.exports = {
before: function(browser) {
clock = sinon.useFakeTimers(new Date(2015, 7, 20).getTime());
},
after: function(browser) {
clock.restore();
browser.end();
},
'some test': function(browser) {
const browserName = this.client.options.desiredCapabilities.browserName;
browser
.url('some/path/')
.waitForElementVisible('body', 5000)
.pause(5000); // I need to use pause here
clock.tick(5001);
browser
.expect.element('.someElement').to.be.enabled;
},
};
问题是当你使用 sinon 假时钟时,时钟被冻结并且所有异步都不起作用(它们等待你提前时钟)。
如果你只是想使用一个假的Date,你可以这样写:
clock = sinon.useFakeTimers(new Date(2015, 7, 20).getTime(), "Date")
或者你可以像这样使用 lolex(更紧凑)
clock = lolex.install(new Date(2015,7,20), ["Date"]);
但是您的代码有问题。
当您在测试中用假时钟替换时钟时,您只是在测试代码中伪造时钟,而不是在浏览器中。
要伪造浏览器时钟,必须加载要测试的页面,并且必须向其中注入 lolex(或 sinon)代码,然后触发伪造。
这花了我几个小时才最终弄明白,我已经使用 lolex 创建了一个 nigthwatch 命令来使这更容易。
您可以在此处找到代码:
https://gist.github.com/vjau/9a8db88d5f1f82d4f9c02e82b29b466f
实际命令是文件fakeDate.js
我找到了解决方案。正如 Vincent J 和他的要点提到的,我需要将 lolex 注入浏览器。
我只用了lolex。我将它注入浏览器,如下所示。
if (__E2E__) {
window.lolex = require('lolex');
}
然后我执行它来设置时间。
browser
.execute(function () {
const clock = window.lolex.createClock(new Date(2015, 7, 20, 19, 45));
window.Date = clock.Date;
});
我正在用 nightwatch.js 做 JavaScript e2e 测试,我想用 sinon.js 的假计时器模拟时钟 http://sinonjs.org/docs/#clock
但是测试在完成之前停止了,我得到了如下日志,并且不再进行了。
[some test] Test Suite
===============================
✔ Element <body> was visible after 5000 milliseconds.
我的测试代码如下。我该如何解决这个问题?谢谢。
module.exports = {
before: function(browser) {
clock = sinon.useFakeTimers(new Date(2015, 7, 20).getTime());
},
after: function(browser) {
clock.restore();
browser.end();
},
'some test': function(browser) {
const browserName = this.client.options.desiredCapabilities.browserName;
browser
.url('some/path/')
.waitForElementVisible('body', 5000)
.pause(5000); // I need to use pause here
clock.tick(5001);
browser
.expect.element('.someElement').to.be.enabled;
},
};
问题是当你使用 sinon 假时钟时,时钟被冻结并且所有异步都不起作用(它们等待你提前时钟)。 如果你只是想使用一个假的Date,你可以这样写:
clock = sinon.useFakeTimers(new Date(2015, 7, 20).getTime(), "Date")
或者你可以像这样使用 lolex(更紧凑)
clock = lolex.install(new Date(2015,7,20), ["Date"]);
但是您的代码有问题。 当您在测试中用假时钟替换时钟时,您只是在测试代码中伪造时钟,而不是在浏览器中。 要伪造浏览器时钟,必须加载要测试的页面,并且必须向其中注入 lolex(或 sinon)代码,然后触发伪造。 这花了我几个小时才最终弄明白,我已经使用 lolex 创建了一个 nigthwatch 命令来使这更容易。 您可以在此处找到代码:
https://gist.github.com/vjau/9a8db88d5f1f82d4f9c02e82b29b466f
实际命令是文件fakeDate.js
我找到了解决方案。正如 Vincent J 和他的要点提到的,我需要将 lolex 注入浏览器。
我只用了lolex。我将它注入浏览器,如下所示。
if (__E2E__) {
window.lolex = require('lolex');
}
然后我执行它来设置时间。
browser
.execute(function () {
const clock = window.lolex.createClock(new Date(2015, 7, 20, 19, 45));
window.Date = clock.Date;
});