【问题标题】:Do we really need isolation frameworks to create stubs?我们真的需要隔离框架来创建存根吗?
【发布时间】:2010-05-22 19:59:26
【问题描述】:

我已阅读:http://martinfowler.com/articles/mocksArentStubs.html 我对存根和模拟的概念很清楚。我了解像 moq、rhinomocks 等隔离框架的需求,并且喜欢创建模拟对象。作为模拟,参与对期望的实际验证。但是为什么我们需要这些框架来创建存根。我宁愿推出一个手工创建的存根并在各种固定装置中使用它。

【问题讨论】:

  • +1 我非常喜欢 TDD 并且已经有很长一段时间了。到目前为止,使用模拟框架还不是很吸引人。我经常发现手动“模拟”通常也可以变成有用的实现,并且在测试中非常可重用。我很想看看人们怎么说。

标签: unit-testing rhino-mocks moq isolation-frameworks mocking


【解决方案1】:

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

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

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

对我来说似乎要简单得多。更不用说我只需要一个哑存根作为参数传递的情况,我不关心它会发生什么(因此不需要设置)。

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

我的建议是学习如何使用具有所有小技巧的优秀模拟库(如 Rhino),我敢打赌,您很快就会学会理解它存在的原因。

【讨论】:

    【解决方案2】:

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

    我自己从未编写过隔离框架,但似乎一旦你有对象模拟,存根就可以轻而易举地创建。这可能是大多数/所有隔离框架都包含存根对象的主要原因。

    关于你的最后一句话(“我宁愿推出一个手工创建的存根并在各种设备中使用它”),你真的在​​任何大型项目中尝试过吗?当然,也许你有一个接口只有一个方法返回一个可以为空的布尔值——你只需要为那个接口编写三个存根,这还不错。

    但是,一旦您开始查看 数十 个要存根的接口和类,跟踪所有不同的存根就会变得一团糟。如果您在多个测试中使用每个存根,您当然可以证明手写存根并将其放在一边是合理的;但是,当您只使用一个特定的存根一两次时,为了简单起见,将其保留为由框架直接生成的“匿名”存根会容易得多。

    【讨论】:

      【解决方案3】:

      在使用了一段时间的模拟框架之后,我发现我的代码设计呈现出完全不同的倾向。这种倾向似乎更多地指向交互风格。换句话说,我对信息和行为比对状态更感兴趣。我的对象变成了服务,而不是使用存根时会发生的有状态对象。通过存根,我最终将状态传递给其他对象。

      然后我的问题就变成了创建抽象层。我不得不质疑某些东西应该在某些层面上相互作用。这有助于创造“最后负责任的时刻”。所以我最终得到了具有生产者和消费者的对象。而介于两者之间的只是消息通道。

      我希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-04
        • 1970-01-01
        • 1970-01-01
        • 2012-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        相关资源
        最近更新 更多