我正在使用sinon 1.17.6。下面是我的代码:

  it('should', sinon.test(function(/*done*/) {
      const stubtoBeStubbedFunction = this.stub(this.myObj, 'toBeStubbedFunction');
      const instance = {
        id: 'instanceId',
        tCount: 3,
      };
      console.log('0 toBeStubbedFunction', this.myObj.toBeStubbedFunction);
      return this.myObj.toBeTestedFunction(instance)
        .then(() => {
          console.log('3 toBeStubbedFunction', this.myObj.toBeStubbedFunction);
          expect(stubtoBeStubbedFunction.calledOnce).to.be.true();
          // done();
        });
  }));


MyClass.prototype.toBeTestedFunction = function toBeTestedFunction(input) {
  const metaData = {};
  this.log.debug('toBeTestedFunction');
  if (input.tCount === 0) {
    console.log('1', this.toBeStubbedFunction);
    return bluebird.resolve((this.toBeStubbedFunction(metaData)));
  }

  return this.myClient.getData(input.id)
    .bind(this)
    .then(function _on(res) {
      if (res) {
        console.log('2', this.toBeStubbedFunction);
        this.toBeStubbedFunction(metaData);
      }
    })
    .catch(function _onError(err) {
      throw new VError(err, 'toBeTestedFunctionError');
    });
};


console.log输出:

0 toBeStubbedFunction toBeStubbedFunction
2 function toBeStubbedFunction(meta) {
  // real implementation
}
3 toBeStubbedFunction function toBeStubbedFunction(meta) {
  // real implementation
}


似乎在测试运行期间,已存根功能已恢复。我认为sinon.test()应在解决或捕获返回的诺言后还原存根(应在console.log('2', this.toBeStubbedFunction);运行后还原存根)。为什么?我使用done解决了我的问题。但是,有更好的解决方案吗?我可能以错误的方式使用mochasinon

欢迎任何意见。谢谢

最佳答案

Sinon 1.x提供的sinon.test方法完全忽略测试返回的promise,这意味着在重置其创建的沙箱之前,它不等待promise解析。

Sinon 2.x从Sinon中删除了sinon.test并将其作为单独的sinon-test package旋转。它最初与Sinon 1.x提供的sinon.test方法存在相同的问题,但问题是reported and resolved

sinon-test的对等依赖项当前为Sinon设置了2.x的最低版本,因此您至少必须升级Sinon并将sinon-test添加到测试套件中以支持承诺并使用提供的测试包装器sinon-test

或者,您可以放弃包装器,而是编写自己的before/beforeEachafter/afterEach挂钩,以帮助您创建和重置沙箱。我已经使用Sinon多年了(肯定是从1.x系列开始,甚至可能更早),而这始终是我所做的。直到几天前看到您提出的另一个问题,我什至都不知道sinon.test

关于javascript - sinon: stub 何时恢复?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45842505/

10-11 11:55