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





5.00/5 (1投票)
--
引言
几年前,我获得了参与一个项目的机会,该项目需要从 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 创建模拟对象或存储库层测试用例。
让我知道您对这种应用程序架构的想法和建议。
我将撰写一篇文章,演示为方法名称不统一的旧项目编写测试用例。