web-dev-qa-db-ja.com

ジャスミン時計はどのように機能しますか?

関連する部分を見つけるために何時間もコードを読みたくありませんが、ジャスミンがその時計をどのように実装しているか興味があります。それの興味深い点は、同期テストコードで非同期コードをテストできることです。 AFAIKでは、ES5をサポートする現在のnode.jsでは、これは不可能です(非同期関数はES7で定義されています)。 estraverseのようなものでjsコードを解析し、同期テストから非同期テストを構築しますか?

私が話していることのほんの一例:

_it("can test async code with sync testing code", function () {
    jasmine.clock().install();

    var i = 0;
    var asyncIncrease = function () {
        setTimeout(function () {
            ++i;
        }, 1);
    };

    expect(i).toBe(0);
    asyncIncrease();
    expect(i).toBe(0);
    jasmine.clock().tick(2);
    expect(i).toBe(1);

    jasmine.clock().uninstall();
});
_

ここでは、expect(i).toBe(1);をコールバックに含める必要があります。

12
inf3rno

install()関数は、実際にはsetTimeoutを、ジャスミンがより詳細に制御できるモック関数に置き換えます。これにより、実際の待機が行われないため、同期されます。代わりに、これも同期しているtick()関数を使用して手動で進めます。

ソースコードを参照してください: https://github.com/jasmine/jasmine/blob/ce9600a3f63f68fb75447eb10d62fe07da83d04d/src/core/Clock.js#L21

内部で5時間のタイムアウトを設定する関数があるとします。 Jasmineは、そのsetTimeout呼び出しを置き換えるだけで、tick()を呼び出したときにコールバックが呼び出され、内部カウンターが5時間のマークに達するかそれを超えます。とても簡単です!

13
m59