我读过这个:http://martinfowler.com/articles/mocksArentStubs.html 我对存根和模拟的概念很清楚。我明白像moq,rhinomocks之类的隔离框架需要创建一个模拟对象。作为嘲笑,参与实际的期望值。但为什么我们需要这些框架来创建存根。我宁愿推出一个手工制作的存根,并将其用于各种固定装置。我们是否真的需要隔离框架来创建存根?
回答
在决定手卷存根是一个更好的选择之前,您是否尝试过使用类似Rhino Mocks的库一两天?
@chibacity:关于嘲讽库的全部想法是避免实现。如果我只需要设置一个属性的值,我不想创建一个接口的完整实现。调用代码如
MyObj obj = MockRepository.GenerateStub<MyObj>();
obj.MyProperty = 33;
对我来说似乎简单得多。更何况我只需要一个愚蠢的存根被作为参数传递,我不在乎它会发生什么(所以不需要设置)。
这并不意味着您不应该为更复杂的场景推出自己的存根,但根据我的经验,这种情况很少见。
我的建议是学习如何使用一个好的嘲弄库(如犀牛)及其所有的小技巧,我敢打赌,你很快就会学会欣赏其存在的原因。
严格来说,不,您不需要需要创建存根的隔离框架。事实上,微软甚至有一个Stubs Framework那只有生成存根,而不是嘲笑。
我从来没有写过一个隔离框架,但它似乎一旦你有对象嘲弄的地方,存根将是一件轻而易举的创建。这可能是绝大多数/全部隔离框架包含存根对象的主要原因。
关于你最后一句话(“我宁愿推出一个手工制作存根并用于各种固定装置”),你是否真的尝试过在任何大型项目上?当然,也许你有一个单一方法的接口,返回一个可为空的布尔值 - 你只需要为该接口编写三个存根,并没有那么糟糕。
但是一旦你开始寻找几十个的接口和类来存根,它只是变得一团糟,以跟踪所有不同的存根。如果你在几次测试中使用每个存根,你当然可以证明手写一个存根并把它放在一边;但是当你只使用一个或两个特定存根时,为了简单起见,将其作为由框架直接生成的“匿名”存根更容易。
使用模拟框架一段时间后,我发现我的代码设计有一个完全不同的倾向。这种倾向似乎更多地以互动风格为导向。换句话说,我比国家对消息和行为更感兴趣。我的对象成为服务而不是有状态的对象,就像使用存根时会发生的一样。随着存根我最终将状态传递给其他对象。
对于我来说,问题变得更多的是创建抽象层。我不得不质疑什么东西应该在某种程度上相互作用。这有助于创建“最后负责任的时刻”。所以我最终得到了有生产者和消费者的对象。中间的一切都只是消息通道。
我希望这会有所帮助。
- 1. 我们真的需要在Java RMI中创建存根吗?
- 2. 这里是否需要内存隔离?
- 3. 我们真的需要在MapReduce框架中进行排序吗?
- 4. 我是否真的需要cmake来实现构建自动化?
- 5. Rhino Mocks - 我们真的需要存根吗?
- 6. 如果我们使用ForkJoinPool框架的Recursiveaction,我们是否需要调用join()?
- 7. 您是否需要.NET 1.0框架来定位.NET 1.0框架?
- 8. 我们是否需要ezpublish_legacy?
- 9. 实体框架是否真的需要工作单元模式?
- 10. 是否真的需要使用express或其他框架与node.js?
- 11. 我们是否需要在新的注释器中创建process()?
- 12. 我们是否真的需要硬编码的DLL
- 13. 当我们创建表时,我们是否需要指定关系的基数?
- 14. 您是否需要使用实体框架来创建WCF服务
- 15. 我们是否真的一直需要使用Ruby/rails插件?
- 16. 我们是否真的需要隐藏js(jquery)代码?
- 17. struct sockaddr,我们是否真的需要给addrlen
- 18. 我们是否真的需要在ThreadLocal中设置事务?
- 19. Azure API Management Premium - 我们是否真的需要备份策略
- 20. AMFPHP with Flex 4 - 我们是否真的需要services-config.xml
- 21. 在使用实体框架时是否真的需要实现存储库?
- 22. 我们是否需要为gcnew创建指针验证
- 23. 我们是否需要为每个ViewModel创建induvidual ViewModelLocators?
- 24. 我是否真的需要Visual Studio
- 25. 我是否需要Ubuntu上的Virtual Box来创建docker机器?
- 26. Websockets - 是否需要额外的框架?
- 27. 我是否需要区分动态创建的复选框?
- 28. Zend缓存我们是否需要每次都创建一个新对象?
- 29. 我是否需要Android手机来创建Android应用程序?
- 30. Python POST JSON - 是否需要Web框架?
+1我非常喜欢TDD,并且已经有很长一段时间了。使用嘲讽框架还没有达到这一点非常吸引人。我经常发现手卷“嘲讽”通常也可以转化为有用的实现,并且在测试中可以重复使用。我很感兴趣,看看有什么人说。 – 2010-05-22 20:11:46