sinon.js存根 - 你能在一个存根化函数上调用多个回调函数吗?

11
如果我有一个需要两个回调函数的函数存根,我该如何使用sinon.js在调用存根函数时连接(sinon.js to wire up)这两个回调函数?
例如,这里有一个需要两个函数作为参数的函数:
function stubThisThing(one, two) {
   ... one and two are functions ...
   ... contents stubbed by sinon.js ...
}

我可以使用sinon来调用任意一个参数

stubbedThing.callsArg(0);
或者
stubbedThing.callsArg(1);

但我似乎无法让两者都被调用。如果我尝试:

stubbedThing.callsArg(0).callsArg(1);
stubbedThing.callsArg(0);
stubbedThing.callsArg(1);

那么 sinon 只会调用第二个参数。如果我按另一种顺序安排,sinon 将调用第一个参数。然而,我希望两者都按顺序依次被调用。


你有检查过 calledWith 方法吗? - Pawan
@Pawan - 你是指来自spy API的calledWith函数吗?那真的不是我要找的。我想改变存根的行为。 - serg10
sinon.js 只支持在每次调用中对每个 stub 调用 最多一个回调函数。它可以在多次调用中调用多个回调函数,例如 stubbedThing.onCall(0).callsArg(0); stubbedThing.onCall(1).callsArg(1);。或者您可以在调用 stubbedThing 后手动调用 callArg :例如 stubbedThing(firstArg, secondArg); stubbedThing.callArg(0); //调用 firstArgs; stubbedThing.callArg(1) // 调用 secondArg - nemesv
@serg10:为什么不把这个问题作为一个 issue 提交到他们的 GitHub 上,也许他们会想出解决方案。 - Pawan
2个回答

7

这不是一个典型的场景,因为很少有方法会连续调用两个方法,我猜这就是为什么它不被支持的原因。但是,请放心,解决方法很简单:

var subject = { 
    method: function(one, two) {} 
};

var stub = sinon.stub(subject, 'method', function(one, two) { 
    one(); 
    two(); 
});

subject.method(
    function() { console.log('callback 1'); }, 
    function() { console.log('callback 2'); });

顺便提一下:这也提供了选择是先调用一个还是两个的选项。


感谢@ChristianKuetbach。该网址已被劫持。由于我不再拥有该文件,因此我将其删除。 - Emil Ingerslev

1
为什么你不完全跳过 sinon?
var obj = { stubMe: function(cb1, cb2) {} };
var originalMethod = obj.stubMe;

obj.stubMe = function(cv1, cb2) { 
  //Whatever logic you wish
  cb1(); 
  cb2(); 
}; 

//Do your test

obj.stubMe = originalMethod; //Restore

如果您愿意,您甚至可以继续使用 sinon 的 API:

var stub = sinon.stub();
obj.stubMe = function(cb1, cb2) { 
  stub.apply(stub, arguments);
  //Rest of whatever logic you wanted here
};

obj.stubMe();
expect(stub.calledOnce()).to.be(true); //That would pass

你觉得怎么样?

最好的建议:D - Simone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接