2016-03-26 11 views
3

私はnightwatch.jsでJavaScriptのE2Eテストをやっている、と私はsinon.jsの偽物タイマーhttp://sinonjs.org/docs/#clocknightwatch.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

問題は、あなたがsinon偽のクロックを使用する場合、クロックが凍結されていることで、すべての非同期は、(あなたが時計を進めるために、彼らは待って)動作しません。 あなただけの偽の日付を使用したい場合、あなたはこのようにそれを書き込むことができます。

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

それとも、この

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

のように(よりコンパクト)lolex使用することができますが、あなたに問題がありますコード。 テストで偽のクロックを時計に置き換えているときは、ブラウザではなくテストコードでクロックをフェイクしているだけです。 ブラウザクロックを偽装するには、テストするページをロードし、lolex(またはsinon)コードを注入して偽装をトリガーする必要があります。 これは最終的にそれを理解するのに数時間かかりました。これをもっと簡単にするためにlolexを使ってnigthwatchコマンドを作成しました。 あなたがここにコードを見つけることができます。

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

を実際のコマンドは、私は解決策を見つけたファイルfakeDate.js

0

です。 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; 
    }); 
関連する問題