代码之家  ›  专栏  ›  技术社区  ›  Adam Driscoll

通过设计考虑简化测试,同时利用依赖注入

  •  1
  • Adam Driscoll  · 技术社区  · 14 年前

    我们进入了一个绿色领域项目,需要几个月的时间来重新设计我们产品的逻辑层和业务层。通过使用mef(依赖注入),我们实现了高水平的代码覆盖率,我相信我们有一个相当可靠的产品。由于我们一直在研究一些更复杂的逻辑,我发现单元测试越来越困难。

    我们使用compositioncontainer来查询这些复杂算法所需的类型。我的单元测试有时很难进行,因为必须进行很长的模拟对象设置过程,以允许对某些情况进行验证。我的单元测试通常比我要测试的代码要花更长的时间来编写。

    我意识到这不仅是依赖注入的问题,也是整个设计的问题。我的测试过于复杂,是因为方法设计不好还是因为缺乏组合?我尝试过对测试进行基本分类,创建常用的模拟对象,并确保尽可能多地利用容器来缓解此问题,但我的测试总是非常复杂,很难调试。您看到了哪些技巧可以使此类测试保持简洁、可读和有效?

    2 回复  |  直到 14 年前
        1
  •  7
  •   Community leo1    7 年前

    我的主观观点:

    • mef看起来是一个非常好的插件框架;它并不是被设计成一个成熟的di框架。如果不需要实时可交换组件,请调查 full DI/IoC Container frameworks . Unity 是微软的替代品。
    • 确定你是 Service Locator anti-pattern . 尽可能使用接口的构造函数注入。看到这个 great post by Mark Seemann this one by Jimmy Bogard . 你所说的“尽可能多地利用容器”是一个值得关注的问题-很少有类需要知道 任何东西 关于集装箱。
    • 获得一个非常好的模拟/隔离框架,并学习如何使用它。我爱 Moq . 尽可能在被测系统上进行状态验证,而不是在模拟上进行行为验证。
    • The Art of Unit Testing . 阅读其他关于单元测试的书籍和文章。实践 TDD . 继续学习。
    • Clean Code 确保你的课程遵循 SOLID 原则(特别是 Single Responsibility Principle )。冗长的模拟设置是一种代码味道;您的类可能做得太多了。高代码覆盖率很好,但更好的度量标准可能是 cyclomatic complexity .
    • 不要担心单元测试的编写时间比生产代码长。不过,将测试当作生产代码对待,并在可以保持可读性和可维护性的情况下删除重复项。
        2
  •  0
  •   ratkok    14 年前

    这里有一些关于di和良好设计实践(在编写可测试代码方面)的好链接,您可能需要查看(google tech talks):

    我发现它们在可测试设计方面有很多有用的技巧。