[翻译]在NUnit中使用Mock对象
来源:广州中睿信息技术有限公司
发布时间:2012/10/21 23:25:16 编辑:itlead 阅读 2891

  NUnit是我在.net开发中首选的单元测试工具。微软也提供了一个单元测试框架,但它仅能在高端版本的Visual Studio中使用,并且它和NUnit非常相似,真想不明白为什么微软要再建立一个自己的版本。在这篇文章中,我想谈谈一个NUnit相对较新的功能--Mock。

  什么是Mock 对象?

  Mock对象是一种技术,它让你隔离要测试的接口对其它类的依赖。这种隔离允许细粒度的单一方法测试。这种隔离使您的测试,可以快速运行,它使测试功能更容易分解成小块。当你在隔离测试代码的各个部分,可以在较大的粒度测试有更高的信心。当你在处理如数据层或Web服务层依赖关系,这种隔离变得更加有趣。这样的外部调用可以是非常耗时的,或者可能会失败,如果远程系统停机维护。

  使用Mock对象伟大的事情之一是,他们迫使你想想你的类和方法的依赖,它迫使你想想你的类之间的耦合。如果你有高耦合,那么你的代码往往是难以测试。如果你有一个松散耦合的设计,测试和使用Mock对象是非常容易得多。早想到这些设计概念可以帮助你更轻松地管理随时间的变化。

  格言:

   良好的设计是优于糟糕的设计

   松散耦合的对象对比紧耦合的对象通常是更好的设计

   测试能随着时间的推移提高代码质量和开发效率

   一个松散耦合的设计更容易测试

  一个简单的项目

  我们要开始用一些简单的代码。我们创建了一个域对象称为人称为IPersonRepository数据访问对象的接口。在这一点上非常简单。

    1.jpg

    2.jpg

  下一步,我们创建一个PersonService对象。这将代表所有在我们的应用程序的业务逻辑。这与数据访问层和返回的信息显示UI层交互。

  我们连接到一起我们的对象使用构造基于依赖注入。所有的依赖对象是通过构造发送。这允许松耦合,因为在PersonService不知道实现类,但只有接口。由于它在构造函数中完成,我们也永远不会有一个无效的PersonService为会出现这种情况,如果有一个二传手为IPersonRepository实施。

  这又是一个相当简单的实现,但我希望足以显示在手的问题。

    3.jpg

  使用NUnit的Mocks

  现在我们可以开始测试我们PersonService。请注意,我们甚至还没有实施的IPersonRepository。这样我们可以确保一切正常,而不必去想其他的应用层预计我们PersonService类。

    4.jpg

    5.jpg

  PersonService并没有很多的逻辑,但我希望这说明如何您可以轻松地测试使用Mock对象的各种条件。它也说明早让你前实现所有的依赖对象来测试一些代码测试的想法。

  虽然建到NUnit的Mock,未必有最强大的或完整的mocking库,它应该是足以满足大多数用途。我敢肯定,他们将继续改善,以及随着时间的推移,他们,所以我期待他们变得更加强大。

 

本站技术原创栏目文章均为中睿原创或编译,转载请注明:文章来自中睿,本站保留追究责任的权利。