2010-05-22 33 views
4

我读过这个:http://martinfowler.com/articles/mocksArentStubs.html 我对存根和模拟的概念很清楚。我明白像moq,rhinomocks之类的隔离框架需要创建一个模拟对象。作为嘲笑,参与实际的期望值。但为什么我们需要这些框架来创建存根。我宁愿推出一个手工制作的存根,并将其用于各种固定装置。我们是否真的需要隔离框架来创建存根?

+1

+1我非常喜欢TDD,并且已经有很长一段时间了。使用嘲讽框架还没有达到这一点非常吸引人。我经常发现手卷“嘲讽”通常也可以转化为有用的实现,并且在测试中可以重复使用。我很感兴趣,看看有什么人说。 – 2010-05-22 20:11:46

回答

4

在决定手卷存根是一个更好的选择之前,您是否尝试过使用类似Rhino Mocks的库一两天?

@chibacity:关于嘲讽库的全部想法是避免实现。如果我只需要设置一个属性的值,我不想创建一个接口的完整实现。调用代码如

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

对我来说似乎简单得多。更何况我只需要一个愚蠢的存根被作为参数传递,我不在乎它会发生什么(所以不需要设置)。

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

我的建议是学习如何使用一个好的嘲弄库(如犀牛)及其所有的小技巧,我敢打赌,你很快就会学会欣赏其存在的原因。

4

严格来说,不,您不需要需要创建存根的隔离框架。事实上,微软甚至有一个Stubs Framework只有生成存根,而不是嘲笑。

我从来没有写过一个隔离框架,但它似乎一旦你有对象嘲弄的地方,存根将是一件轻而易举的创建。这可能是绝大多数/全部隔离框架包含存根对象的主要原因。

关于你最后一句话(“我宁愿推出一个手工制作存根并用于各种固定装置”),你是否真的尝试过在任何大型项目上?当然,也许你有一个单一方法的接口,返回一个可为空的布尔值 - 你只需要为该接口编写三个存根,并没有那么糟糕。

但是一旦你开始寻找几十个的接口和类来存根,它只是变得一团糟,以跟踪所有不同的存根。如果你在几次测试中使用每个存根,你当然可以证明手写一个存根并把它放在一边;但是当你只使用一个或两个特定存根时,为了简单起见,将其作为由框架直接生成的“匿名”存根更容易。

2

使用模拟框架一段时间后,我发现我的代码设计有一个完全不同的倾向。这种倾向似乎更多地以互动风格为导向。换句话说,我比国家对消息和行为更感兴趣。我的对象成为服务而不是有状态的对象,就像使用存根时会发生的一样。随着存根我最终将状态传递给其他对象。

对于我来说,问题变得更多的是创建抽象层。我不得不质疑什么东西应该在某种程度上相互作用。这有助于创建“最后负责任的时刻”。所以我最终得到了有生产者和消费者的对象。中间的一切都只是消息通道。

我希望这会有所帮助。

相关问题