如何在每次测试前重置Sinon间谍的“被叫”计数?
这就是我现在正在做的事情:
beforeEach(function() {
this.spied = sinon.spy(Obj.prototype, 'spiedMethod');
});
afterEach(function() {
Obj.prototype.spiedMethod.restore();
this.spied.reset();
});
但是当我在测试中检查通话计数时:
it('calls the method once', function() {
$.publish('event:trigger');
expect(this.spied).to.have.been.calledOnce;
});
...测试失败并报告该方法被调用X次(每次上一次测试也触发同一事件一次)。
答案 0 :(得分:40)
这个问题曾被问过一段时间,但可能仍然很有趣,特别是对于那些刚接触到sinon的人。
由于this.spied.reset()
删除了间谍,因此不需要 Obj.prototype.spiedMethod.restore();
。
更新2018-03-22 :
正如我的回答中的一些评论所指出的,stub.reset将做两件事:
根据docs,此行为已添加到sinon@2.0.0。
问题的更新答案是使用stub.resetHistory() 。
文档示例:
var stub = sinon.stub();
stub.called // false
stub();
stub.called // true
stub.resetHistory();
stub.called // false
更新:
reset
。这可以保持间谍。 restore
。使用sinon时,您可以使用sinon assertions进行增强测试。因此,不是写expect(this.spied).to.have.been.calledOnce;
而是写一个:
sinon.assert.calledOnce(Obj.prototype.spiedMethod);
这也适用于this.spied
:
sinon.assert.calledOnce(this.spied);
还有很多其他的sinon断言方法。 calledOnce
旁边还有calledTwice
,calledWith
,neverCalledWith
以及sinon assertions上的更多内容。