【问题标题】:Possible to stub method twice within a single test to return different results?可以在单个测试中两次存根方法以返回不同的结果吗?
【发布时间】:2017-07-13 06:59:23
【问题描述】:

我想重新存根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
    });
  });
});

【问题讨论】:

    标签: javascript unit-testing sinon stub


    【解决方案1】:

    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()

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

    【讨论】:

    • @gor181 谢谢你,它真的帮助了我,节省了我很多时间。
    • 谢谢。它确实节省了大量时间。
    【解决方案2】:

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

    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 stub(obj, 'meth', fn) has been removed, see documentation。此当前语法将执行与上述相同的操作:sandbox.stub(someHandler, 'getStatus').callsFake(() => callCount++ == 0 ? 1 : 0);.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 2011-04-15
    相关资源
    最近更新 更多