【问题标题】:Calling different callbacks for stub on firstcall and second call在第一次调用和第二次调用时为存根调用不同的回调
【发布时间】:2016-10-03 17:32:53
【问题描述】:

我正在 sinon 中寻找一种方法,以便在第一次和第二次调用存根方法时调用不同的函数。

这是一个例子:

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 •环境:Node JS

【问题讨论】:

    标签: sinon


    【解决方案1】:

    我发现做你想做的事(使用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 调用中,并且可以返回不同的值)。

    对于这三种方法,你可以看下面的fiddle with examples:https://jsfiddle.net/elbecita/jhvvv1h1/

    【讨论】:

      【解决方案2】:

      您可以使用 sinon.stub() 中的 callsArgcallsArgWith 来让 sinon 调用回调

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

      然后你可以这样做:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          onCall 为我工作。 我的代码如下:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-04-13
            相关资源
            最近更新 更多