模拟和存根

Ana*_*and 29 ruby ruby-on-rails mocking ruby-on-rails-3

我真的不明白Mocks和Stubs是什么.我想知道我们在测试用例中何时,为何以及如何使用Mocks.我知道Ruby on Rails中的Mocks和Stubs有很好的框架,但不知道目的,我不愿意在我的应用程序中使用它们.

你能澄清一下Mocks和Stubs吗?请帮忙.

nat*_*vda 64

我非常简单的答案是:

  • 模拟是具有与其他类似接口的对象
  • 存根是假方法并返回特定答案

我们两个都试图实现相同的目标:我们希望单独测试特定的单元(模型/视图/控制器/模块).例如,当我们测试控制器时,我们不想测试我们的模型,所以我们使用模拟.我们希望确保调用正确的方法,例如find.所以在我们的模拟器上,我们有一个存根,它将返回预定义的东西,而不会实际进入数据库.

因此,我们测试期望:我们期望被调用的方法(在其他单元上),而不实际调用它们.对该特定方法的测试应该已经在其自己的测试中进行了介绍.


0x4*_*672 15

根据Fowler的文章,模拟不是存根,存根是独立于外部调用的假方法,而模拟是假的对象,具有对调用的预编程反应.

嘲讽的是更具体和相关对象:如果某些参数传递,那么对象返回了一定的成果.对象的行为被模仿或"嘲笑".

Stubbing更通用且与方法相关:stubbed方法通常返回所有参数的相同结果.方法的行为被冻结,罐装或"存根".


neo*_*pir 2

模拟用于基于交互的测试来验证行为。通过模拟,您可以断言被测试的方法调用了另一个方法。例如,我可能想确保控制器对象调用存储库来获取一些数据。

存根用于基于状态的测试来设置特定的应用程序状态。与模拟不同,您不必担心是否进行了调用。例如,如果您正在测试某些存储库代码,您可能需要设置一个存根方法以确保存储库在数据库连接关闭时正确处理这种情况。