我对rspec和整个TDD方法很新颖。有人可以解释模拟和存根之间的区别。我们什么时候使用它们以及什么时候使用Factory Girl来在测试用例中创建对象?模拟,存根和工厂女孩有什么区别?
回答
你可以把一个模拟(或双)是假的对象。当你正在测试并需要使用一个在你的测试中不易使用的对象时,你可以使用一个模拟来近似你如何期望这个对象的行为和解决方法。存根可以以类似的方式使用,但可以在对象上使用单独的方法。
下面是一个使用都不少的虚构的例子:
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对于生成测试数据很有用。您可能会使用工厂作为用于为您的模型创建实例的配方,您可能需要测试涉及大量测试数据的事情,这可能会导致使用fixtures不起作用并且明确创建复杂对象的情况可能会很乏味。
你的第一站是Martin Fowler的著名的文章:Mocks are not Stubs
编辑
Mocks
和Stubs
两种类型Test Doubles(Mezaros术语)的。测试双击通常用于模拟被测系统(或被测类)所需的依赖关系,以便SUT/CUT可以独立于其依赖关系进行测试。 (买者 - 精确术语可以是相当通过Jeff here提到一个敏感的问题例如)
维基百科:
- "Test stubs provide canned answers"
- "mock objects can simulate the behavior of complex, real objects"
实例
- 存根方法可能只是返回一个常数值w母鸡被SUT叫来,例如用于开展SUT的特定测试案例。
*
像Mockito(Java)和Moq(.Net)这样的框架允许您用最少的代码在运行中针对依赖项的接口构建模拟类,并提供验证SUT是否与模拟正确交互的功能,例如通过检查SUT用正确的参数调用模拟方法的正确次数。
*免责声明 - 我不是一个Ruby开发
当你阅读完这篇文章后,你可以进入[制作TDD的嘲弄](http://avdi.org/devblog/2011/09/06/making-a-mockery-of-tdd/) –
- 1. 工厂女孩vs. User.create - 有什么区别?
- 2. 工厂女孩 - 有
- 3. 工厂女孩和HAS_ONE
- 4. 工厂女孩没有存在验证
- 5. 与工厂女孩
- 6. 工厂女孩的虚拟数据
- 7. 工厂女孩叫模特吗?
- 8. Rspec工厂女孩问题
- 9. 如何在工厂女孩
- 10. 工厂女孩的属性
- 11. 工厂女孩belongs_to的:CLASS_NAME
- 12. Rails工厂女孩协会
- 13. MiniTest的工厂女孩
- 14. 工厂方法和抽象工厂设计模式有什么区别?
- 15. 策略和工厂设计模式有什么区别?
- 16. 工厂和管道设计模式有什么区别?
- 17. 从工厂女孩返回模拟对象
- 18. 工厂女孩对象有很多通过和存在验证
- 19. 使用工厂女孩,Rspec2和Rails 3.1.0
- 20. Rspec +工厂女孩(没有导轨!)
- 21. 工厂女孩没有注册用户
- 22. 工厂女孩has_many当孩子需要
- 23. 工厂女孩:想要防止一些性状的工厂女孩回调
- 24. 存根工厂女子观察员类
- 25. rspec和工厂女孩的重复工厂错误?
- 26. Firebase - ref和孩子有什么区别?
- 27. 空?不工作在工厂女孩
- 28. 在RSpec中,存根有什么区别!和存根?
- 29. 工厂女孩/轨道:发电机为现有模型创建工厂?
- 30. DI与工厂模式有什么区别?
我可能是错的,但我认为你在方法上存在错误。你可以有存根对象或模拟对象,或者存根方法或模拟方法。不同的是你如何使用它们。存根(stub)只是让测试工作而不实际调用另一个依赖关系。 Mock也是这样做的,但调用是必需的,也是测试的一部分。你可能有一个虚假的对象,既有存根也有嘲笑。 Rspec甚至称它们为“双”而不是模拟。 – fregas