我已经读过: http://martinfowler.com/articles/mocksarentstubs.html我对存根和模拟的概念很明确。我了解需要隔离框架,例如MOQ,Rhinomocks,并喜欢创建模拟对象。如嘲笑,参与预期的实际涉嫌。但是,为什么我们需要这些框架来创建存根。我宁愿推出手工创建的存根并将其用于各种固定装置。

有帮助吗?

解决方案

您是否尝试使用像Rhino Mocks这样的图书馆一两天,然后才能确定手工滚动的存根是更好的选择?

@chibacity:关于嘲笑库的整个想法是 避免 实施。如果我只需要设置单个属性的值,我就不想创建整个接口的实现。呼叫代码类似

MyObj obj = MockRepository.GenerateStub<MyObj>();
obj.MyProperty = 33;

对我来说似乎更简单。更不用说我只需要一个愚蠢的存根作为参数的情况,而我不在乎它发生了什么(因此不需要设置)。

这并不意味着您不应该为更复杂的场景推出自己的存根,但是根据我的经验,这种情况很少见。

我的建议是学习如何使用其所有小技巧使用良好的模拟图书馆(例如犀牛),我敢打赌,您很快就会学会欣赏其存在的原因。

其他提示

严格来说,不,你不 需要 一个隔离框架来创建存根。实际上,微软甚至有一个 存根框架只要 生成存根,而不是模拟。

我自己从来没有写过一个隔离框架,但是似乎一旦您对象嘲笑,存根就会变得轻而易举。这可能是大多数/所有隔离框架都包含存根对象的主要原因。

关于您的最后一句话(“我宁愿推出手工制作的存根并在各种固定装置中使用它”),您实际上是否在任何相当大的项目上都尝试过?当然,也许您有一个带有单个方法的接口,该方法返回了无效的布尔 - 您只需要为该接口编写三个存根,这还不错。

但是一旦你开始看 许多 在界面和类中的类中,跟踪所有不同的存根,这简直是一团糟。如果您在几个测试中使用了每个存根,那么您肯定可以证明手工编写的存根并将其放在一边;但是,当您仅使用一个或两次特定的存根时,为了简单起见,将其保留为直接生成的“匿名”存根要容易得多。

使用模拟框架一段时间后,我发现我的代码设计具有完全不同的倾斜度。这种倾斜似乎以一种互动方式定向。换句话说,我对信息和行为比状态更感兴趣。我的对象像使用存根一样成为服务而不是状态对象。使用存根,我最终将状态传递到其他对象。

然后,我的问题更多地成为创建抽象层。我必须质疑某些级别应该在某些层面上进行交互。这有助于创造“最后负责任的时刻”。因此,我最终得到了有生产者和消费者的对象。两者之间的所有内容都是消息频道。

我希望这有帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top