2016-03-26 15 views
3

Ich bin mit nightwatch.js JavaScript e2e-Test zu tun, und ich mag die Uhr mit sinon.js gefälschten Timer verspotten http://sinonjs.org/docs/#clockWie nutze ich gefälschte Timer mit nightwatch.js und sinon.js?

Aber Test stoppt, bevor es Ziel, bekam ich das Protokoll wie unten, und nicht Fortschritte mehr.

[some test] Test Suite 
=============================== 
✔ Element <body> was visible after 5000 milliseconds. 

Mein Testcode ist wie folgt. Wie kann ich das Problem lösen? Vielen Dank.

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

Antwort

1

Das Problem ist, dass, wenn Sie sinon gefälschte Uhr verwenden, wird die Uhr eingefroren und alles async funktioniert nicht (sie warten, bis Sie die Uhr zu besuchen). Wenn Sie nur ein gefälschtes Datum verwenden mögen, können Sie es wie folgt schreiben:

clock = sinon.useFakeTimers(new Date(2015, 7, 20).getTime(), "Date") 

Oder Sie können lolex (kompakteren) wie diese

clock = lolex.install(new Date(2015,7,20), ["Date"]); 

verwenden, aber es gibt ein Problem mit Ihrem Code. Wenn Sie die Uhr in Ihrem Test durch die falsche Uhr ersetzen, täuschen Sie nur die Uhr im Testcode, NICHT im Browser. Damit die Browser-Uhr gefälscht wird, muss die Seite, die Sie testen möchten, geladen werden, und Sie müssen lolex (oder sinon) Code hinein injizieren und dann die Fälschung auslösen. Das hat mich ein paar Stunden gekostet, bis ich es endlich herausgefunden habe und ich habe mit lolex einen Nighthwatch-Befehl erstellt, um das zu vereinfachen. Sie können den Code finden Sie hier:

https://gist.github.com/vjau/9a8db88d5f1f82d4f9c02e82b29b466f

Der eigentliche Befehl ist die Datei fakeDate.js

0

ich die Lösung gefunden. Wie Vincent J und sein Geist erwähnten, musste ich lolex in den Browser injizieren.

Ich habe nur Lolex verwendet. Ich spritze es wie unten beschrieben in den Browser.

if (__E2E__) { 
    window.lolex = require('lolex'); 
} 

Und ich führe es zum Einstellen der Zeit.

browser 
    .execute(function() { 
    const clock = window.lolex.createClock(new Date(2015, 7, 20, 19, 45)); 
    window.Date = clock.Date; 
    });