模拟和存根

时间:2011-03-02 06:21:45

标签: ruby-on-rails ruby ruby-on-rails-3 mocking

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

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

3 个答案:

答案 0 :(得分:64)

我非常简单的回答是:

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

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

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

答案 1 :(得分:15)

根据福勒的文章mocks are not stubs,存根是独立于外部调用的虚假方法,而模拟是假对象,具有对调用的预编程反应。

模拟更具体和与对象相关: 如果传递了某些参数,则该对象返回某些结果。对象的行为被模仿或“嘲笑”。

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

答案 2 :(得分:2)

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

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