我应该在单元测试中使用AutoMapper吗?

Nei*_*ell 8 c# unit-testing automapper

我正在为ASP.NET MVC控制器方法编写单元测试.

那些控制器依赖于IMapper- 我创建的接口用于抽象AutoMapper,使用Castle Windsor通过构造函数注入传入.

Action方法用于IMapper从域对象映射到ViewModel对象,然后再返回,目的是保持DRY并保持动作方法简洁.

在我的单元测试中,我应该

  1. 使用正确的绑定配置AutoMapper(它们是使用AutoMapper配置文件构建的,因此可测试并可在网站和单元测试项目之间重复使用)并将其作为正确的AutoMapper实现传递IMapper.

  2. 传入模拟对象(我正在使用Moq)作为IMapper实例,具体取决于测试(这意味着复制测试设置代码中的一些工作,以确保从模拟映射器返回的对象与模拟映射器假装的对象相关来图).

  3. 手动配置AutoMapper只需要我认为每次测试都需要的映射(很多工作和意味着我没有测试真正使用的映射).

在单元测试中使用基础设施代码的意见是什么?它在什么时候成为集成测试(即测试AutoMapper和我的控制器的集成)?

虽然我认为我需要了解更多关于Moq以及如何让它返回与传递给它所嘲笑的方法的实际值相关的值,但感觉2是纯粹的观点.

jer*_*ley 6

我倾向于同意#2.你知道automapper工作,你知道你的注入工作(得到了正确的测试吗?:-))我会更专注于细节,不仅仅是SomeClass.Property = AnotherClass.Property - 这些特殊情况应该测试不基本复制功能.不要测试框架内容.

至于更多测试代码 - 我觉得完全没问题.对于给定的单位,应该在给定的测试中(也在合理的范围内)设置测试.

关于Moq,语法很简单,不要过度思考它.var obj = new Mock(); 然后将你的属性设置为obj.Setup(x => x.Property).returns("hello"),除非你有更具体的问题?Moq也设置了所有属性,因此您甚至可能不需要自动播放器

-edit-发现它,它是obj.SetupAllProperties();


Phi*_*ill 5

我喜欢杰里利(Jeriley)的第二名

添加到最小起订量中,如果您需要基于传递给它的值返回对象,则可以这样编写设置:

mockObject.Setup(x => x.MapObject(It.IsAny())
          .returns(((ProductDto productDto)=> 
           {
               var product = new Product()
               {
                   ID = productDto.Id,
                   名称= productDto.Name
               };

               退货
           });

有点混乱,但方便。