【问题标题】:Test 'done' callback function of a jQuery deferred object with sinon.js使用 sinon.js 测试 jQuery 延迟对象的“完成”回调函数
【发布时间】:2013-01-07 06:49:26
【问题描述】:

我的一个 Backbone 视图中有这段 CoffeeScript 代码:

myMethod: ->
     # some code here

     $.when(
          # ...
     ).done(
          @myCallback
     )

我想测试 myCallback 在 done 块中是否被调用。

我不确定如何在 Mocha.js + Sinon.js 中执行此操作。我能够监视 jquery 并检查 when 方法是否被调用:

spy = sinon.spy($, 'when')
@view.myMethod()
spy.called.should.be.true
spy.restore()

但是我不能对 done 块做同样的事情,因为如果我理解正确的话,它与 when 方法返回的延迟对象有关。

我也试过这样的:

# NOT WORKING CODE
stub = sinon.stub($.Deferred(), 'done').returns
     myCallback: sinon.stub()
@view.myMethod()
stub.called.should.be.true
stub.restore()

但仍然得到:

expected false to be true

有什么想法吗? :)

【问题讨论】:

  • 您不应该使用@myCallback 而不是@myCallback() 吗?只是一个盲目的猜测。但是 $.done 不存在。 done 是 promise 对象的一部分,所以我猜它是 $.Deferred().done
  • @pocesar 你是对的,这是一个错字(一旦我没有使用复制和粘贴......对不起!)。我同意你关于延期的看法,我这样写是为了明确我想要实现的目标。我试图对此进行监视,并且还尝试对 promise 对象进行存根,但没有成功。进一步的想法?

标签: jquery backbone.js callback sinon spy


【解决方案1】:

您可以像执行 ajax 请求一样存根 $.when。首先你必须存根$.when 并返回一个$.Deferred 对象。

var stub = sinon.stub($, "when", function (event) {
    var result = $.Deferred();
    result.args = event;
    return result;
})

调用要测试的函数后,获取特定$.when 调用的返回值,这将是延迟对象。手动解决,就可以断言@myCallback被调用了。

@view.myMethod()

// Get first when call
var call = $.when.getCall(0).returnValue;

// To return successful when call (having used .done() )
call.resolve();

【讨论】:

    【解决方案2】:

    在视图类中模拟它?

    #arrange
    view = new View
    view.myCallback = sinon.spy()
    
    #act
    view.myMethod()
    
    #assert
    view.myCallback.called.should.be.true
    

    回调是作为延迟的done 处理程序调用还是以任何其他方式调用是一个实现细节。调用该方法应该很重要(如果您选择,请使用正确的参数)。

    【讨论】:

    • 这个函数好像还没有被调用。可能由于某些原因无法触发 done 回调?
    • 也许您的测试发现了一个错误 :) 顺便说一句。我不确定我的 sinon 断言是否正确,只是从您的问题中复制而来。只在 Jasmine 断言中使用 sinon。
    • 如果是这样,我希望找到它 :) 该功能正在运行,它是在我注意到它之前未经测试而编写的,我不想让它被发现。断言很好,以前用过很多次,实际上我得到了一个“好错误”。
    • 延迟是异步操作吗?您是否需要将测试声明为与 Mocha 异步?
    • 或者,如果延迟是异步的,则在断言时尚未调用回调。不过,不知道如何用 Mocha 来处理这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 2018-08-08
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    相关资源
    最近更新 更多