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

时间:2011-01-12 00:36:42

标签: c# unit-testing automapper

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

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

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

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

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

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

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

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

    感觉2是纯粹的观点,尽管我认为我需要了解更多有关Moq以及如何让它返回与传递给它嘲弄的方法的实际值相关的值。

2 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:4)

我赞成#2喜欢jeriley

添加到Moq,如果你需要根据传递给它的值返回一个对象,你可以像这样编写你的设置:

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

               return product
           });

有点乱,但很方便。