是否可以在一次测试中将方法存根两次以获得 return 不同的结果?

Possible to stub method twice within a single test to return different results?

我想重新存根 someHandler.getStatus,但我得到 TypeError: Attempted to wrap getStatus which is already wrapped ..

it('is a test', function() {

  sandbox.stub(someHandler, 'getStatus', function(callback) {
    callback(null, {
      value: 1
    });
  });

  sandbox.stub(someOtherHandler, 'doSomething', function(callback) {
    callback(null);
  });

  sandbox.stub(someHandler, 'getStatus', function(callback) {
    callback(null, {
      value: 0
    });
  });
});

尝试使用外部变量跟踪调用。第一次调用时,return 第一个值并递增计数器。第二次调用(以及所有后续调用),return 第二个值。

it('is a test', function() {

  let callCount = 0

  sandbox.stub(someHandler, 'getStatus', function(callback) {
    callback(null, {
      value: callCount++ == 0 ? 1 : 0
    });
  });

  sandbox.stub(someOtherHandler, 'doSomething', function(callback) {
    callback(null);
  });    
});

这是一个处理 2 个调用的简单示例,但您可以根据需要扩展它以处理多个调用。

Sinon 有一个很好的 API 用于处理对同一个存根方法的多次调用 (stub.onCall(n);)

示例来自 stub api doc

"test should stub method differently on consecutive calls": function () {
    var callback = sinon.stub();
    callback.onCall(0).returns(1);
    callback.onCall(1).returns(2);
    callback.returns(3);

    callback(); // Returns 1
    callback(); // Returns 2
    callback(); // All following calls return 3
}

您还可以使用 onFirstCall()onSecondCall()onThirdCall()

我们在测试中广泛使用这种方法。