web-dev-qa-db-ja.com

最初の呼び出しと2番目の呼び出しでスタブの異なるコールバックを呼び出す

私は、スタブメソッドの最初と2番目の呼び出しで異なる関数を呼び出す方法を探しています。

次に例を示します。

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を呼び出す場合)、この動作が発生します。

よろしく、ラジェッシュ

•Sinonバージョン:1.17.4•環境:Node JS

12
Rajesh Nagpal

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);を使用して直接値を返す、またはスタブメソッドが呼び出されるたびにインクリメントされるカウンターを定義するなど、他のオプションがあります(これにより、どのn-callであるかがわかり、返すことができます異なる値)。

これら3つのアプローチについては、次のフィドルと例を見ることができます。 https://jsfiddle.net/elbecita/jhvvvh1

18
elbecita

Sinon.stub()のcallsArgおよびcallsArgWithを使用して、sinonにコールバックを呼び出させることができます。

スタブに、指定されたインデックスの引数をコールバック関数として呼び出します。 stub.callsArg(0);スタブが最初の引数をコールバックとして呼び出すようにします。 ソース

その後、次のようなことができます:

  myStub.onCall(0).callsArgWith(0, first);
  myStub.onCall(1).callsArgWith(0, second);
1
Danny Sandi

これは古いスレッドですが、少なくとも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
coder_mz

onCallは私のために働いた。私のコードは次のようになります:

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