【问题标题】:Using Moq and TDD, where to start?使用 Moq 和 TDD,从哪里开始?
【发布时间】:2011-08-07 02:28:16
【问题描述】:

我有一个服务器应用程序,我想知道如果我想开始实施 TDD 并使用 Moq,我应该从哪里开始。

我可以阅读哪些关于这个主题的好书,哪些不是太“面向网络”?

我对此事有疑问,例如:

我应该模拟我想测试的每个对象,还是只模拟那些我无法实现的对象,比如文本编写器?

我的服务器需要进行大量设置才能真正执行我想要测试的任何操作,我是否应该将其塞入[TestInitialize] 函数中?

如果我想测试更深层次的功能,我应该如何链接我的测试?

【问题讨论】:

    标签: c# unit-testing tdd moq


    【解决方案1】:

    我推荐两本书:Test Driven Development by Example,作者 Kent Beck。这是一本关于 TDD 的优秀书籍,我特别喜欢这本书,因为他通过一个示例进行了演示,这对于了解节奏和思维过程非常有用。另一方面,它对嘲笑有点轻。为此,我会阅读 Roy Osherove 的 The Art of Unit Testing。正如标题所暗示的,它并没有专门关注 TDD,而是关注如何编写好的单元测试;他对模拟和存根有很好的报道。

    关于你应该模拟什么,模拟的想法是允许你将你正在测试的类/函数与环境的其余部分隔离开来,这样你就可以在你控制的假环境中测试它的行为。在那个框架中,你不应该嘲笑这个班级,而是嘲笑它所依赖的东西。

    一个简单的例子:如果您有一个使用 Logger 的类,那么测试该类是否“写入”到 logger 会非常痛苦,并且可能涉及检查 logger 是否已写入文本文件之类的事情。这在很多层面上都不是一个好主意 - 首先是您的班级并不关心记录器如何具体完成其工作。在这种情况下,您可以将类中的 Logger 实例替换为 Fake、mocked Logger,然后您可以验证您的类是否在适当的时间调用 Logger,而不必担心 logger 究竟做了什么。

    关于服务器初始化:单元测试通常在内存中,与环境没有依赖关系,因此如果您正在执行 TDD,您可能不必这样做。一般来说,单元测试中有太多(任何?)初始化代码是一个不好的迹象。

    这表明您正在寻找更多的验收测试/BDD 样式测试。我在Behavior-Driven Development with SpecFlow and WatiN 上推荐了这篇最近在 MSDN 杂志上的文章;它解释了如何通过一起开发高级测试来以测试优先的方式进行开发,这些测试验证应用程序正在执行用户想要的操作(验收测试,您将在其中运行实际的服务器和应用程序),并且它正在执行它通过编写小段代码来满足开发人员的意图(单元测试)。

    希望这会有所帮助,祝测试愉快!

    【讨论】:

    • 为了完成任何事情我需要做一些事情,因为我要测试的东西通常与服务器打开时实例化的某些元素有关。所以我需要执行我的脚本编译器(它构建一个 dll 并包含它的程序集),并初始化和配置这些文件(即在相当多的脚本中调用静态方法调用)
    【解决方案2】:

    如果您希望遵循 TDD 模式,您的代码应该随着测试的开发而发展。您将寻求单一责任,并且如上所述模拟/存根您正在测试的类所具有的任何依赖项。通过这种方式,您可以在任何依赖项上设置虚拟数据和预期行为,而不必再担心它们。

    这里有一个简短的介绍:http://www.agiledata.org/essays/tdd.html 不幸的是,我没有任何具体的书名可以根据个人经验推荐。

    阅读本文也可能有助于您入门:http://stephenwalther.com/blog/archive/2008/06/12/tdd-introduction-to-moq.aspx

    【讨论】:

      【解决方案3】:

      我最喜欢的 TDD 书籍之一是 Test Driven Development By Example (Kent Beck)。我也很喜欢他的4-part screen cast

      第 1 集: 入门测试(28 分钟)

      在本集中,我们对示例应用程序的第一个功能进行了第一次测试,并将其切分以提供更频繁的反馈。

      第 2 集: 隔离测试(23 分钟)

      在本集中,我们确保测试不会相互影响。隔离测试后,我们将实施几个新操作。

      第 3 集: 大片(25 分钟)

      在本集中,我们采用了一个大型功能并将其拆分,以提供更频繁的反馈。最后我们清理代码以消除重复并使代码更易于阅读。

      第 4 集:结束(20 分钟)

      在这一集中,我们完成了示例应用程序的功能并准备好供其他人使用。在开发早期被推迟的设计决策现在更加清晰。该系列最后总结了所有剧集的经验教训。

      【讨论】:

        【解决方案4】:

        您不会模拟要测试的对象。如果你这样做,你正在测试模拟,而不是你的对象!您需要模拟您正在测试的对象的依赖项

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-22
          • 1970-01-01
          • 2012-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多