sinon:当存根恢复时?

时间:2017-08-23 14:26:41

标签: javascript promise mocha sinon

我正在使用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()应该在返回的promise被解决或捕获后恢复存根(在console.log('2', this.toBeStubbedFunction);运行后应该恢复存根)。 为什么?我使用done来解决我的问题。但有更好的解决方案吗?我可能以错误的方式使用mochasinon

欢迎任何评论。感谢

1 个答案:

答案 0 :(得分:0)

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