使用Autofac和Moq进行集成测试

Min*_*dan 2 c# integration-testing automated-tests moq autofac

使用Autofac和moq开发集成测试是一个好主意吗?我在网上找到的大多数示例和文档都集中在单元测试中使用两个.集成测试有什么好的例子吗?通过集成测试,我的意思是一些方法,如按钮,自上而下或三明治方法.

ton*_*oft 5

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

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

至于Moq,我不建议使用Moq进行集成测试.模拟很适合单元测试,因为单元测试使用系统测试非常小的区域,并且与模拟对象的交互通常很简单(如果没有,那么也许你应该重构单元测试!).但是,通过集成测试,您将测试整个系统,并且可能会与您尝试模拟的对象进行许多交互.此外,随着系统的变化,即使结果保持不变,与模拟的交互也可能会发生变化.因此,为集成测试设置和维护模拟会变得非常困难和繁琐,因为通常需要设置许多方法调用.

此外,集成测试可能是多线程的,并且事情可能并不总是以相同的顺序发生.再次,难以嘲笑!

更好的集成测试方法是实际实现对象的内存版本.它应该尽可能接近真实的东西.可能你必须在内存实现中添加其他方法来执行诸如设置初始状态(在DAO示例中,设置一些测试数据)或检查输出之类的操作.随着集成测试基础的增长,从长远来看,您会发现这更加灵活.

为了清楚起见,我认为Moq对于单元测试非常有用,而不是集成测试.