0

我在我的一个主干视图中有这段 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

有任何想法吗?:)

4

2 回答 2

1

$.when您可以像执行 ajax 请求一样存根。首先,您必须存根$.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();
于 2016-07-06T08:51:48.063 回答
0

在视图类中模拟它?

#arrange
view = new View
view.myCallback = sinon.spy()

#act
view.myMethod()

#assert
view.myCallback.called.should.be.true

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

于 2013-01-23T17:47:57.800 回答