在firstcall和second call上调用存根的不同回调

时间:2016-06-03 15:13:58

标签: sinon

我在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

4 个答案:

答案 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()中的callsArgcallsArgWith来使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);