【发布时间】:2011-11-12 12:55:29
【问题描述】:
我对 rspec 和整个 TDD 方法还是很陌生。有人可以解释模拟和存根之间的区别。我们什么时候使用它们,什么时候使用 Factory Girl 在测试用例中创建对象?
【问题讨论】:
标签: ruby-on-rails rspec mocking factory-bot
我对 rspec 和整个 TDD 方法还是很陌生。有人可以解释模拟和存根之间的区别。我们什么时候使用它们,什么时候使用 Factory Girl 在测试用例中创建对象?
【问题讨论】:
标签: ruby-on-rails rspec mocking factory-bot
您可以将模拟(或双重)视为假对象。当您正在测试并且需要使用在测试中不容易使用的对象时,您可以使用模拟作为您期望该对象如何表现和解决它的近似值。存根可以以类似的方式使用,但用于对象的单个方法。
这是一个相当人为的例子,它同时使用了很多:
class Client
def connect_to_server
if Server.connect.status == 'bad'
show_an_error
else
do_something_else
end
end
def do_something_else; end
def show_an_error; end
end
context "failure" do
it "displays an error" do
bad_network_response = double("A bad response from some service", :status => 'bad')
Server.should_receive(:connect).and_return(bad_network_response)
client = Client.new
client.should_receive(:show_an_error)
client.connect_to_server
end
end
您可以想象使用大量模拟或存根是一个坏主意;这基本上掩盖了测试中的部分代码,但是对于一些困难/罕见的测试场景来说,这是一个简单的解决方案。
Factory Girl 可用于生成测试数据。您将使用工厂作为为您的模型创建实例的配方,您可能需要测试涉及大量测试数据的东西,而在这种情况下,使用夹具将不起作用并且显式创建复杂的对象可能很乏味。
【讨论】:
您的第一站是 Martin Fowler 的著名文章:Mocks are not Stubs
编辑
Mocks 和Stubs 是Test Doubles(Mezaros 术语)的两种类型。测试替身通常用于模拟被测系统(或被测类)所需的依赖关系,以便可以独立于其依赖关系来测试 SUT / CUT。 (警告 - 精确的术语可能是一个非常敏感的主题,例如 Jeff here 提到的)
来自维基百科:
示例
*Mockito (Java) 和 Moq (.Net) 等框架允许您使用最少的代码即时针对依赖项的接口构建模拟类,并提供验证 SUT 是否与模拟,例如通过检查 SUT 使用正确的参数调用模拟方法的次数是否正确。* 免责声明 - 我不是 ruby 开发人员
【讨论】: