3

jasmine を使用してこの qunit テストのように_.debounce 関数をテストしようとすると、奇妙なことが起こります。

...を使用してテストできるようjasmine.Clock.useMock()です...しかし、私が書くとき:

it('_.debounce()', function () {
    var spy = jasmine.createSpy('debounce'),
        debouncedSpy = _.debounce(spy, 100);

    jasmine.Clock.useMock();

    // direct calls
    debouncedSpy();
    debouncedSpy();
    debouncedSpy();

    // timed out calls
    setTimeout(debouncedSpy, 60);
    setTimeout(debouncedSpy, 120);
    setTimeout(debouncedSpy, 180);
    setTimeout(debouncedSpy, 240);
    setTimeout(debouncedSpy, 300);

    jasmine.Clock.tick(300);
    expect(spy).toHaveBeenCalled();

    jasmine.Clock.tick(400);
    expect(spy).toHaveBeenCalled();

    jasmine.Clock.tick(1000);
    expect(spy.callCount).toBe(1);
});

機能しません (呼び出し回数は 3 です)。しかし、直接呼び出しがなければ (または を使用している場合setTimeout(..., 0))、すべて正常に動作します。私が間違っていることは何ですか?

また、私はそれをやろうとしましたが、うまくいきましrunswaits。しかし、なぜ前の例でうまくいかないのでしょうか?

it('should be called once', function () {
    var spy = jasmine.createSpy('debounce'),
        debouncedSpy = _.debounce(spy, 100);

    runs(function () {
        debouncedSpy();
        debouncedSpy();
        debouncedSpy();

        expect(spy).not.toHaveBeenCalled();

        setTimeout(debouncedSpy, 60);
        setTimeout(debouncedSpy, 120);
        setTimeout(debouncedSpy, 180);
        setTimeout(debouncedSpy, 240);
        setTimeout(debouncedSpy, 300);
    });

    waits(800);

    runs(function () {
        expect(spy.callCount).toBe(1);
    });
});
4

2 に答える 2

4

https://github.com/pivotal/jasmine/issues/361およびhttps://github.com/pivotal/jasmine/pull/455まで。これをテストに追加して、Jasmine にデバウンス遅延をスキップさせます。

_.debounce = function (func) { return function () { func.apply(this, arguments);}; };
于 2014-08-21T22:31:46.667 に答える
2

ジャスミン モック クロックは の動作を変更するだけでsetTimeout、それは同類です。現在はモックアウトしてDateませ。 /455 . runsand waitsFor(または jasmine 2.0コールバック) を使用するとdone、実際に時間が経過するため、ブラウザーは実際にDate値を変更し、内部で発生する日付計算がdebounce加算されます。

于 2014-01-25T19:32:57.250 に答える