65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 IOC 和 MOQ 简化自动化单元测试

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2016年12月13日

CPOL

3分钟阅读

viewsIcon

14165

--

引言

几年前,我获得了参与一个项目的机会,该项目需要从 Web 窗体迁移到 MVC,我被分配了一项任务,即为测试网站提出一个好的测试方法。 后来,我与多家公司合作,但我找到了一种这样的方法,并帮助他们使用相同的方法简化了单元测试。 这可能对您也有帮助,我想知道您对此有何看法。

*** 这种方法不是集成测试,而是为了最大限度地减少重复工作,以便可以用较小的努力维护单元测试用例。(大多数时候,更新测试用例  或为具有相同模式的类编写测试用例(仅插入、更新、删除、查看,而没有太多复杂的逻辑)非常无聊且重复。

示例代码的形式非常简单,您可以根据需要进行改进。 它可在  https://github.com/vicharemakrand/SampleCode-Testing 上找到

背景

您应该了解 

  • MOQ
  • IOC – 例如,该示例中使用了结构映射
  • 单元测试框架 – 例如 MS unit / Nunit / Xunit
  • Nbuilder 类似用于生成模拟数据。

总结

  • 使用 IOC 创建模拟对象
  • 以较少的努力维护测试用例
  • 有助于维护代码的统一性,这在基于 scrum 的项目中非常有用。

传统方法的缺点

  • 大量重复的代码,我们在其中模拟依赖项
  • 需要相当大的努力才能使测试用例保持最新。
  • 这可能会导致人们失去对正确测试业务案例的关注。

关于我的方法

我们将使用内存数据库(使用 Nbuilder 生成)而不是为每个测试模拟每个方法并决定输出,并且依赖项将由 IOC 处理。

此外,我们不使用 MOQ 模拟服务层方法,而是使用所有方法,因为它将调用存储库层,该层被模拟以用于内存数据库。

 让我们从底部开始。 示例代码涵盖了 GitHub 上可用的用户表,网址为 https://github.com/vicharemakrand/SampleCode-Testing

 

示例代码说明

1. 内存模拟数据库

我们需要为每个映射到数据库表的实体模型准备模拟数据。

  • 为用户表创建一些模拟记录

  • 创建一个类来将模拟记录存储在一个集合中

2. 使用 MOQ 创建模拟存储库对象

在这里,我们设置存储库方法,但不是硬编码结果。 我们执行与方法相关的实际简单操作。 这种方法节省了大量重复代码和维护工作。

3. IOC – 接口和类映射

在这里,我们将接口映射到生成的模拟对象,这些对象也存储模拟数据。

4. 为测试项目创建 IOC 容器。

5. 现在编写测试用例会更容易

5.1 服务层测试用例

5.2 存储库层测试用例

5.3 MVC 控制器测试用例

 

最后的想法

在实际项目中,这种方法可以通过各种方式实现。 您不必完全实现它。 如果您不同意这种方法 100%,那么您也可以选择一些东西,例如使用 IOC 创建模拟对象或存储库层测试用例。

让我知道您对这种应用程序架构的想法和建议。

我将撰写一篇文章,演示为方法名称不统一的旧项目编写测试用例。

© . All rights reserved.