使用Moq和TDD,从哪里开始?

时间:2011-04-16 22:41:02

标签: c# unit-testing tdd moq

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

关于这个问题我能阅读哪些好书,哪些不太“面向网络”?

我对此事有疑问,例如:

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

我的服务器需要进行大量设置才能真正做我想测试的事情,我应该把它塞进[TestInitialize]函数吗?

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

4 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:7)

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

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

一个简单的例子:如果你有一个使用Logger的类,测试该类“写入”到记录器会非常痛苦,并且可能涉及检查记录器是否已写入文本文件。这在很多层面上都不是一个好主意 - 从你的班级不关心记录器如何完成其​​工作的事实开始。在这种情况下,您将使用伪造的模拟Logger替换类中的Logger实例,然后您可以在适当的时候验证您的类是否正在调用Logger,而不必担心记录器的作用。

关于服务器初始化:单元测试通常在内存中,不依赖于环境,因此如果您正在进行TDD,则可能不必这样做。通常,单元测试中的太多(任何?)初始化代码都是一个不好的标志。

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

希望这有帮助,并且快乐测试!

答案 2 :(得分:5)

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

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

在本集中,我们对样本应用程序的第一个特征进行了第一次测试,并将其切片以提供更频繁的反馈。

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

在本集中,我们确保测试不会相互影响。一旦测试被隔离,我们就会实施几项新的操作。

第3集:大特色(25分钟)

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

第4集:整理(20分钟)

在本集中,我们完成了示例应用程序的功能,并准备供其他人使用。在开发早期推迟的设计决策现在更加清晰。该系列文章以所有剧集的课程摘要结束。

答案 3 :(得分:1)

如果您希望遵循TDD模式,您的代码应该通过开发测试来发展。你要去单一的责任,并提到mock / stub你正在测试的类所依赖的任何依赖。这样,您可以在任何依赖项上设置虚拟数据和预期行为,而不必再担心它们。

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

阅读本文可能对您有所帮助:http://stephenwalther.com/blog/archive/2008/06/12/tdd-introduction-to-moq.aspx