如何访问提供给我在 Sinon 中存根的函数的参数?

How can I access the arguments that were provided to a function that I've stubbed in Sinon?

我正在尝试测试使用 Ember.run.debounce 的 EmberJS 应用程序。我想用 Sinon 存根 Ember.run.debounce 以便它只会同步调用 debounced 方法。像这样:

debounceStub = sinon.stub(Ember.run, 'debounce')
debounceStub.callsArgWith(1, debounceStub.args[0][2])

使此代码运行同步:

Ember.run.debounce(@, @handleData, list, 500)

但是 handleData() 正在使用未定义的参数而不是 list 进行调用。任何有关如何在 callsArgWith 调用中传递 list 的帮助将不胜感激。

谢谢!

之所以使用 undefined 调用 handleData 是因为您定义存根 (callsWithArg(...)) 行为的时间点是在存根被调用之前(通过执行您的单元-under-test),因此对 args 的引用尚不可用。

有点难看,但一种解决方案是手动调用传递给 debounce 的方法,例如...

debounceStub = sinon.stub(Ember.run, 'debounce')

//...execute unit-under-test so that `debounce` is called...

//Then pull out the arguments from the call
var callArgs = debounceStub.firstCall.args.slice();
var targetObject = callArgs.shift();
var methodToCall = callArgs.shift();
var methodArgsToPass = callArgs.shift();

//Manually invoke the method passed to `debounce`.
methodToCall.apply(targetObject, methodArgsToPass);

//perform your assertions...