当我尝试使用 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)
时)一切正常。我做错了什么?我也尝试通过
runs
和 waits
来做到这一点,并且它有效。但为什么它在前面的例子中不起作用?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/361 和 https://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/