4

我正在阅读这个文档sinonjs.org,对我来说并不清楚存根和模拟之间的区别。
有人可以用简单的话和一些例子来解释一下存根和模拟之间的区别吗?

PS:
我已经阅读过什么是模拟和存根(JMock)之间的区别,但答案没有例子。

4

2 回答 2

2

我将尝试用几句话来解释:

  • 模拟:如果要验证 SUT 中的协作,请使用它。您必须模拟协作者,然后验证协作是否完成。

    var collaborator = {};
    collaborator.collaboration = sinon.mock();
    SUT.setCollaborator(collaborator);
    SUT.play();
    collaborator.collaboration.verify();
    
  • stub:如果您的 SUT 需要协作者,请使用它,但测试不是测试协作。

    var collaborator = {};
    collaborator.collaboration = sinon.stub().returns(1);
    SUT.setCollaborator(collaborator);
    SUT.play();
    

stubs 和 mocks 下的技术是相似的,不同的是测试的意图。

来自http://sinonjs.org/docs/#mocks

模拟带有可能无法通过测试的内置期望。因此,他们强制执行实施细节。经验法则是:如果您不为某些特定调用添加断言,请不要模拟它。请改用存根。

于 2012-08-28T11:41:29.180 回答
2

以下重要说明将帮助您了解间谍、存根和模拟之间的确切区别:

  • 间谍,提供有关函数调用的信息,而不影响其行为
  • Stubs,类似于间谍,但完全取代了功能。这使得一个存根函数可以做任何你喜欢的事情——抛出一个异常,返回一个特定的值,等等
  • 模拟,通过结合间谍和存根使替换整个对象更容易
于 2018-10-13T05:55:51.413 回答