首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jasmine.Clock VS sinon.clock我的jasmin.Clock.useMock()用法有什么问题?

jasmine.Clock VS sinon.clock我的jasmin.Clock.useMock()用法有什么问题?
EN

Stack Overflow用户
提问于 2012-06-20 06:06:51
回答 1查看 1.7K关注 0票数 2

我只是在尝试用javascript/coffeescript和jasmine进行单元测试,非常好。

我一直在尝试使用jasmine.Clock.Mock()在时间上前进并触发setTimeout回调。

可惜,jasmine.Clock.tick(1001)似乎没有任何效果!然后我发现sinon.js有它自己的时间模拟,使用这个就可以了。我想知道为什么。

这是一个需要测试的虚拟jquery插件:

代码语言:javascript
复制
dummy_method = function(callback) {
  fire_callback = function() {
    callback();
  }
  setTimeout("fire_callback()", 1000);
}

下面是两个版本的规格:

代码语言:javascript
复制
# 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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-23 04:07:50

Jasmine只是尝试调用一个函数,其中sinon测试传递的参数是函数还是字符串。如果是字符串,则调用eval

茉莉:

代码语言:javascript
复制
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);
  }
};

Sinon:

代码语言:javascript
复制
if (typeof timer.func == "function") {
    timer.func.apply(null, timer.invokeArgs);
} else {
    eval(timer.func);
}

所以这将通过Jasmin测试

代码语言:javascript
复制
setTimeout(fire_callback, 1000);

虽然这将会失败

代码语言:javascript
复制
setTimeout("fire_callback()", 1000);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11110195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档