使用 Autofac 和 Moq 进行集成测试

Integration Test Using Autofac and Moq

使用Autofac和moq开发集成测试是个好主意吗? 我在网上找到的大多数示例和文档都侧重于在单元测试中使用这两个。集成测试有什么好的例子吗? 我所说的集成测试是指某些方法,例如按钮启动、自上而下或三明治方法。

我建议您定义集成测试的含义,因为该术语没有公认的定义。我假设您的意思是单独测试整个应用程序,即一起测试多个(可能数百个)类,但不与外部系统(例如数据库、http 服务)交互。

在您的项目中引入某种依赖注入或控制反转是个好主意。无论您使用 Autofac 还是其他解决方案,集成测试的好处都是一样的——依赖注入允许您替换系统中与外界通信的部分,例如您的 DAO,具有在内存中运行的模拟或存根版本。例如,在生产中,您可能会使用由外部 MSSQL 数据库支持的 DAO,但在集成测试中,您可能会使用由内存中的字典或 HashMap 支持的存根 DAO。

至于最小起订量,我不建议使用最小起订量进行集成测试。模拟非常适合单元测试,因为单元测试会测试系统中非常小的区域,并且与模拟对象的交互通常很简单(如果不是,那么也许您应该重构您的单元测试!)。然而,通过集成测试,您正在测试整个系统,并且可能会有很多很多与您试图模拟的对象的交互。此外,随着系统的变化,与模拟的交互可能会发生变化,即使结果保持不变。因此,为集成测试设置和维护模拟可能会变得非常困难和乏味,因为您通常必须设置很多很多方法调用。

此外,集成测试可能是多线程的,事情可能不会总是以相同的顺序发生。同样,很难嘲笑!

集成测试的更好方法是实际实现对象的内存版本。它应该尽可能接近真实的东西。您可能必须在内存实现中为此添加额外的方法来执行设置初始状态(在 DAO 示例中,设置一些测试数据)或检查输出等操作。随着集成测试基础的增长,您会发现在较长的 运行 中这更加灵活。

需要说明的是,我认为 Moq 对于单元测试非常有用,而不是集成测试。