繁体   English   中英

如何使用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假时钟时,时钟被冻结,所有异步都不起作用(它们等你推进时钟)。 如果你只想使用假日期,你可以像这样写:

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;
  });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM