我对rspec和整个TDD方法都很陌生。有人可以解释一下mock和stub之间的区别。我们何时使用它们,何时使用Factory Girl在测试用例中创建对象?
答案 0 :(得分:16)
你的第一站是Martin Fowler的着名文章:Mocks are not Stubs
修改强>
Mocks
和Stubs
是Test Doubles的两种类型(Mezaros术语)。测试双精度通常用于模拟被测系统(或被测试类)所需的依赖关系,以便可以独立于其依赖关系测试SUT / CUT。 (警告 - 精确的术语可能是一个非常敏感的话题,例如Jeff here提到的)
来自维基百科:
实施例
*
像Mockito(Java)和Moq(。Net)这样的框架允许您使用最少的代码动态地构建针对依赖项接口的模拟类,并提供能够验证SUT是否与模拟正确交互,例如通过检查SUT使用正确的参数调用mock的方法正确的次数。*免责声明 - 我不是红宝石
答案 1 :(得分:16)
您可以将模拟(或双重)视为假对象。当您正在测试并且需要使用在测试中不易使用的对象时,您可以使用模拟作为您期望该对象的行为和解决方法的近似值。存根可以以类似的方式使用,但可以在对象上的单个方法上使用。
这是一个使用大量两者的相当人为的例子:
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对于生成测试数据非常有用。您可以使用工厂作为为模型创建实例的配方,您可能需要测试涉及大量测试数据的内容,这将是使用fixture无法工作并且显式创建复杂对象的情况可能很乏味。