我正在使用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
来解决我的问题。但有更好的解决方案吗?我可能以错误的方式使用mocha
和sinon
。
欢迎任何评论。感谢
答案 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/beforeEach
和after/afterEach
挂钩,以便为您创建和重置沙箱。我已经使用了Sinon多年(肯定是从1.x系列开始,甚至可能更早),而这一直是我所做的。在我几天前看到你提出的另一个问题之前,我甚至都不知道sinon.test
。