在每次测试之前,如何重设Sinon spy 的“被叫”计数?

这是我现在正在做的事情:

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次(对于每个先前触发相同事件的测试也一次)。

最佳答案

这个问题是在不久前提出的,但可能仍然很有趣,特别是对于刚接触sinon的人。

不需要this.spied.reset(),因为Obj.prototype.spiedMethod.restore();可以删除 spy 。

更新2018-03-22 :

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

  • 删除存根行为
  • 删除存根历史记录(callCount)。

  • 根据docs,此行为已添加到[email protected]中。

    该问题的更新答案将是使用stub.resetHistory()

    来自文档的示例:
    var stub = sinon.stub();
    
    stub.called // false
    
    stub();
    
    stub.called // true
    
    stub.resetHistory();
    
    stub.called // false
    

    更新:
  • 如果只想重设调用计数,请使用reset。这样可以保留 spy 。
  • 要使用删除 spy ,请使用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的更多内容。

    关于javascript - 重置Sinon Spy的 “called”计数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19883505/

    10-12 12:26