web-dev-qa-db-ja.com

Mochaテストで時間の経過をシミュレートして、setTimeoutコールバックが呼び出されるようにするにはどうすればよいですか?

定期的なタスクを実行するために setTimeout に依存するJavaScriptコードをテストする必要があります。 Mochaテストから時間の経過をシミュレートして、setTimeoutコールバックが呼び出されるようにするにはどうすればよいですか?

私は基本的に Jasmineのモッククロック に類似した機能を求めています。

37
aknuds1

Fake Timers のドキュメントに記載されているように、Sinon.JSがsinon.useFakeTimersを介してJavaScriptクロックの操作をサポートしていることがわかりました。私は既にモック目的でSinonを使用しているのでこれは完璧です。モカライブラリはモックライブラリの領域にあるため、Mocha自体がこれをサポートしていないのは理にかなっていると思います。

以下は、Mocha/Chai/Sinonを使用した例です。

var clock;
beforeEach(function () {
     clock = sinon.useFakeTimers();
 });

afterEach(function () {
    clock.restore();
});

it("should time out after 500 ms", function() {
    var timedOut = false;
    setTimeout(function () {
        timedOut = true;
    }, 500);

    timedOut.should.be.false;
    clock.tick(510);
    timedOut.should.be.true;
});
57
aknuds1