2016-03-26 27 views
3

我在做与nightwatch.js的JavaScript测试端到端的,我想用sinon.js的假定时器http://sinonjs.org/docs/#clock如何使用nightwatch.js和sinon.js使用假定时器?

嘲笑时钟,但完成它之前停止测试,我得到的日志像下面,并且不进步了。

[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; 
    }, 
}; 

回答

1

的问题是,当您使用兴农假的时钟,时钟被冻结,一切异步不工作(他们都在等待您来推进时钟)。 如果你只是想用一个假的日期,你可以写这样的:

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

0

我找到了解决办法。正如文森特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; 
    });