当我尝试使用 Jasmine 在 _.debounce function 中测试 this qunit test 时,会发生一些奇怪的事情。

似乎可以使用 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);
    });
});

最佳答案

直到 https://github.com/pivotal/jasmine/issues/361https://github.com/pivotal/jasmine/pull/455 。已发布,您将其添加到您的测试中以让 Jasmine 跳过去抖动延迟。

_.debounce = function (func) { return function () { func.apply(this, arguments);}; };

关于underscore.js - 使用 Jasmine 的异步函数规范,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13707047/

10-13 09:11