犀牛模拟模拟和存根之间有什么区别?

我没有玩这个,通常使用嘲笑,但我不知道这两者之间有什么区别,什么时候使用犀牛嘲笑之一。

更新:

我也用艾恩德的话来回答我的问题:

存根和嘲difference之间的区别

您可以在本文中获得这些术语的实际定义: Mocks不是存根 。 我想把注意力集中在Rhino Mocks的观点上。

模拟是我们可以设定预期的一个对象,并且将validation预期的行为确实发生了。 存根是您用来传递给testing代码的对象。 你可以设定期望,所以它会以某种方式行事,但这些期望永远不会被validation。 存根的属性将自动performance为正常的属性,并且不能对它们设置期望值。

如果你想validation被测代码的行为,你将使用一个适当的期望模拟,并validation。 如果您只想传递一个可能需要以某种方式行事的值,但不是此testing的重点,那么您将使用一个存根。

重要提示:存根永远不会导致testing失败。

按照这个

…简而言之,模拟和存根对象之间是有区别的,RhinoMocks认识到允许我们编写能更好地expression它们目的的testing。

模拟对象用于定义期望,即:在这种情况下,我期望方法A()被调用这样和那样的参数。 嘲笑logging和validation这样的期望。

另一方面,存根具有不同的目的:它们不logging或validation期望值,而是允许我们“replace”“假”对象的行为,状态以便利用testing场景。

一般来说,unit testing调用函数和方法,然后检查是否发生预期的行为。 这些函数和方法可能需要参数。 我们使用存根和模拟来满足这些参数。 我们有时也可能嘲笑全球对象。

存根

存根是一个微小的假对象,您的testing可以用作参数来使函数调用工作。 这让我们validation了被测function的行为。 它不会让我们validation任何副作用,因为存根没有实现。

嘲弄

模拟是一个实现的存根。 如果我们的testing函数与我们的模拟对象相互作用,我们就可以validation模拟已经与我们预期的相互作用了。

例如,假设我们有一个模拟的用户对象,并且我们想validation我们的session.login方法是否有效,我们可能想要检查user.lastLoggedIn是否被设置。 我们可以创build一个实现此方法的模拟用户。 当我们调用session.login时,我们可以断言user.lastLoggedIn具有我们所期望的状态。

总结一下

模拟是一个实现的存根,让我们testing副作用。

这种差异仍然很重要吗?

像明喻和隐喻之间的区别,存根和嘲讽之间的区别是微妙的和历史的,也许与testing世界中不同的社区和哲学有关,而不是任何主要的技术差异。

他们代表testing略有不同的方法。 模拟可以写成一个存根。 一个存根通常可以扩展成一个模拟。

你应该使用哪一个?

你可能会发现你开始创build存根,然后你可能会发现你需要为你的一些对象创build完整的模拟。 你可能想嘲笑一切,或者你可能只是想在需要的地方进行模拟。

模拟和存根之间的区别:使用存根,你修复了你的unit testing的input:所以你的unit testing不会对存根和存根进行断言,通过重写某些方法的实现来修复假对象的行为。 使用Mock,你可以修正你的unit testing的输出:所以你的unit testing通过检查模拟对象中的内部交互来预测你的Mocking对象。

在Moq框架的情况下 – 设置方法是STUB,其中Verify方法是Mock

我注意到的一件事是,当我使用MockRepository.GenerateMock时,我需要明确地设置期望在一个特定的方法调用来拦截该调用。 有了存根,只要它是虚拟的,它似乎会自动拦截任何方法。