重置“被叫”指控Sinon Spy

时间:2013-11-09 21:47:33

标签: javascript unit-testing mocha sinon chai

如何在每次测试前重置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次(每次上一次测试也触发同一事件一次)。

1 个答案:

答案 0 :(得分:40)

这个问题曾被问过一段时间,但可能仍然很有趣,特别是对于那些刚接触到sinon的人。

由于this.spied.reset()删除了间谍,因此不需要

Obj.prototype.spiedMethod.restore();

更新2018-03-22

正如我的回答中的一些评论所指出的,stub.reset将做两件事:

  1. 删除存根行为
  2. 删除存根历史记录(callCount)。
  3. 根据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旁边还有calledTwicecalledWithneverCalledWith以及sinon assertions上的更多内容。