15

関連する部分を見つけるために何時間もコードを読みたくないのですが、ジャスミンがどのように時計を実装しているかに興味があります。興味深い点は、同期テスト コードを使用して非同期コードをテストできることです。私の知る限り、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);は、コールバックにある必要があります。

4

1 に答える 1

18

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

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

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

于 2015-03-05T23:12:04.193 に答える