【问题标题】:How to use Fake timers with nightwatch.js and sinon.js?如何在 nightwatch.js 和 sinon.js 中使用假定时器?
【发布时间】:2016-03-26 07:53:26
【问题描述】:

我正在用 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;
  },
};

【问题讨论】:

    标签: javascript sinon nightwatch.js e2e-testing


    【解决方案1】:

    问题在于,当您使用 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

    【讨论】:

      【解决方案2】:

      我找到了解决方案。正如 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;
        });
      

      【讨论】:

      • 如何使用 webdriverIO 做到这一点?每当我尝试执行此操作时“browser.execute(function(){ window.lolex = require('lolex')}) 我收到以下错误:“javascript 错误:未定义要求”。有没有办法可以工作围绕这个?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 2012-05-22
      • 2013-06-20
      • 1970-01-01
      相关资源
      最近更新 更多