我在sinon中寻找一种方法,在第一次和第二次调用stub方法时调用不同的函数。
以下是一个例子:
var func1 = function(connectionPolicy, requestOptions, callback) {
callback({ code: 403 });
}
var func2 = function (connectionPolicy, requestOptions, callback) {
callback(undefined);
}
var stub = sinon.stub();
// Something of this form
stub.onCall(0) = func1;
stub.onCall(1) = func2;
request.createRequestObjectStub = stub;
因此,当在内部调用request.createrequestObjectStub时(调用公共API时),我会看到这种行为。
此致 拉杰什
•诗乃版本:1.17.4 •环境:节点JS
答案 0 :(得分:16)
我找到了你想做的事情(使用onCall(index)
和匿名存根)的唯一方法是使用bind
JS函数。
这将是:
stub.onCall(0).returns(func1.bind()());
stub.onCall(1).returns(func2.bind()());
如果您使用stub.onCall(0).returns(func1());
,则在定义onCall时会执行函数func1
,这就是您需要.bind
的原因。
无论如何,你有其他的选择,比如直接用.onCall(index).returns(anObject);
返回一个值,或者定义一个每次调用stubbed方法时递增的计数器(这样你就知道你在哪个n-call中,你可以返回不同的值)。
对于这三种方法,您可以看到以下示例:https://jsfiddle.net/elbecita/jhvvv1h1/
答案 1 :(得分:1)
您可以使用sinon.stub()中的callsArg
和callsArgWith
来使sinon调用回调函数
使存根在提供的索引处调用参数作为回调函数。 stub.callsArg(0);使存根调用第一个参数作为回调。 source
然后您可以执行以下操作:
myStub.onCall(0).callsArgWith(0, first);
myStub.onCall(1).callsArgWith(0, second);
答案 2 :(得分:0)
这是一个旧线程,但是至少从Sinon 1.8开始,更有效的解决方法是将sinon.onCall(arg)
与callsFake()
链接起来。
因此,在您的用例中,您可以执行以下操作:
var func1 = function(connectionPolicy, requestOptions, callback) {
callback({code: 403});
}
var func2 = function(connectionPolicy, requestOptions, callback) {
callback(undefined);
}
var stub = sinon.stub();
// Solution
stub.onCall(0).callsFake(func1);
stub.onCall(1).callsFake(func2);
request.createRequestObjectStub = stub;
答案 3 :(得分:0)
onCall为我工作。 我的代码如下:
const stubFnc = sinon.stub(myObject, "myFunction");
stubFnc.onCall(0).returns(mockObject1);
stubFnc.onCall(1).returns(mockObject2);