Javascript jasmine.Clock VS sinon.Clock what';我的jasmin.Clock.useMock()用法有什么问题吗?
我只是尝试用jasmine在javascript/coffeescript中进行单元测试,非常好 我一直在尝试使用jasmine.Clock.Mock()来提前执行时间并触发setTimeout回调 唉,茉莉花。时钟。滴答声(1001)似乎没有任何效果! 然后我发现sinon.js有自己的时间模拟,使用这个就可以了。我想知道为什么 下面是一个要测试的虚拟jquery插件:Javascript jasmine.Clock VS sinon.Clock what';我的jasmin.Clock.useMock()用法有什么问题吗?,javascript,tdd,coffeescript,jasmine,sinon,Javascript,Tdd,Coffeescript,Jasmine,Sinon,我只是尝试用jasmine在javascript/coffeescript中进行单元测试,非常好 我一直在尝试使用jasmine.Clock.Mock()来提前执行时间并触发setTimeout回调 唉,茉莉花。时钟。滴答声(1001)似乎没有任何效果! 然后我发现sinon.js有自己的时间模拟,使用这个就可以了。我想知道为什么 下面是一个要测试的虚拟jquery插件: dummy_method = function(callback) { fire_callback = function
dummy_method = function(callback) {
fire_callback = function() {
callback();
}
setTimeout("fire_callback()", 1000);
}
以下是两个版本的规范:
# Working test (spy was called as expected), using sinon FakeTimers
describe "jQuery.fn.countdown", ->
beforeEach () ->
this.clock = sinon.useFakeTimers();
afterEach () ->
this.clock.restore()
it 'should fireup the callback', ->
countdown_callback = jasmine.createSpy('countdown_callback');
dummy_method(countdown_callback)
this.clock.tick(1001)
expect(countdown_callback).toHaveBeenCalled()
# Non-working test (spy is never called), using jasmine Clock Mock
describe "jQuery.fn.countdown", ->
beforeEach () ->
jasmine.Clock.useMock()
it 'should fireup the callback', ->
countdown_callback = jasmine.createSpy('countdown_callback');
dummy_method(countdown_callback)
jasmine.Clock.tick(1001)
expect(countdown_callback).toHaveBeenCalled()
Jasmine只是尝试调用一个函数,其中sinon测试传递的参数是函数还是字符串。如果是字符串,则调用
eval
茉莉花:
jasmine.getGlobal().setTimeout = function(funcToCall, millis) {
if (jasmine.Clock.installed.setTimeout.apply) {
return jasmine.Clock.installed.setTimeout.apply(this, arguments);
} else {
return jasmine.Clock.installed.setTimeout(funcToCall, millis);
}
};
if (typeof timer.func == "function") {
timer.func.apply(null, timer.invokeArgs);
} else {
eval(timer.func);
}
Sinon:
jasmine.getGlobal().setTimeout = function(funcToCall, millis) {
if (jasmine.Clock.installed.setTimeout.apply) {
return jasmine.Clock.installed.setTimeout.apply(this, arguments);
} else {
return jasmine.Clock.installed.setTimeout(funcToCall, millis);
}
};
if (typeof timer.func == "function") {
timer.func.apply(null, timer.invokeArgs);
} else {
eval(timer.func);
}
所以这将通过茉莉花测试
setTimeout(fire_callback, 1000);
而这将失败
setTimeout("fire_callback()", 1000);
他妈的,谢谢!我甚至不知道函数对象可以传递给setTimeout和setInterval。。。坏习惯我想:(