【发布时间】:2011-07-07 01:15:28
【问题描述】:
我真的不明白什么是 Mocks 和 Stubs。我想知道我们在测试用例中何时、为什么以及如何使用 Mocks。我知道在 Ruby on Rails 中有很好的 Mocks 和 Stub 框架,但不知道目的,我不愿意在我的应用程序中使用它们。
你能澄清一下 Mocks 和 Stubs 吗?请帮忙。
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 mocking
我真的不明白什么是 Mocks 和 Stubs。我想知道我们在测试用例中何时、为什么以及如何使用 Mocks。我知道在 Ruby on Rails 中有很好的 Mocks 和 Stub 框架,但不知道目的,我不愿意在我的应用程序中使用它们。
你能澄清一下 Mocks 和 Stubs 吗?请帮忙。
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 mocking
我非常简化的答案是:
我们都试图实现相同的目标:我们想单独测试一个特定的单元(模型/视图/控制器/模块)。例如。当我们测试控制器时,我们不想测试我们的模型,所以我们使用模拟。我们要确保调用正确的方法,例如find。所以在我们的模拟中,我们有一个存根,它会返回一些预定义的东西,而不需要真正进入数据库。
所以我们测试期望:我们期望调用的方法(在其他单元上),而不是实际调用它们。该特定方法的测试,应该已经包含在它自己的测试中。
【讨论】:
根据 Fowler 的文章 mocks are not stubs,存根是独立于外部调用的假方法,而模拟是对调用有预编程反应的假对象。
模拟更具体且与对象相关: 如果传递了某些参数,则对象返回某些结果。对象的行为被模仿或“模仿”。
存根更通用且与方法相关: 存根方法通常为所有参数返回相同的结果。方法的行为被冻结、固定或“存根”。
【讨论】:
在基于交互的测试中使用模拟来验证行为。使用模拟,您可以断言被测方法调用了另一个方法。例如,我可能想确保控制器对象调用存储库来获取一些数据。
存根用于基于状态的测试以设置特定的应用程序状态。与模拟不同,您不必担心是否进行了调用。例如,如果您正在测试一些存储库代码,您可能希望设置一个存根方法以确保存储库正确处理数据库连接关闭时的情况。
【讨论】: