第一次和第二次调用存根时调用不同的回调函数

29

我正在寻找一种方法,在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;

所以当在调用公共API时,在内部调用request.createrequestObjectStub时,我看到这种行为。

  • Sinon版本:1.17.4
  • 环境:Node JS
  • Sinon版本:1.17.4
  • 环境:Node JS
4个回答

33

我找到的实现你想要的功能(使用 onCall(index) 和匿名存根)的唯一方法是使用 JavaScript 函数中的 bind 方法。

具体做法如下:

stub.onCall(0).returns(func1.bind()());
stub.onCall(1).returns(func2.bind()());
如果你使用stub.onCall(0).returns(func1());,那么在定义onCall时将执行函数func1,这就是为什么需要使用.bind的原因。
无论如何,你还有其他选择,比如直接使用.onCall(index).returns(anObject)返回一个值,或者定义一个计数器,在调用存根方法时每次递增(这样你就知道是第几次调用了,并且可以返回不同的值)。
对��这三种方法,你可以查看以下带有示例的fiddle:https://jsfiddle.net/elbecita/jhvvv1h1/

10

onCall 对我很有帮助。 我的代码如下:

const stubFnc = sinon.stub(myObject, "myFunction");
stubFnc.onCall(0).returns(mockObject1);
stubFnc.onCall(1).returns(mockObject2);

5

这是一个旧的线程,但至少在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;

1
你可以使用sinon.stub()中的callsArgcallsArgWith来让sinon调用回调函数。

使存根调用所提供索引处的参数作为回调函数。stub.callsArg(0); 会导致存根将第一个参数作为回调函数调用。source

然后你可以像这样做:
  myStub.onCall(0).callsArgWith(0, first);
  myStub.onCall(1).callsArgWith(0, second);

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