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

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

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

Action方法使用IMapper从域对象映射到ViewModel对象并再次返回,旨在保持DRY并保持操作方法简洁。

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

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

  • 传递mock对象(我使用MOQ)为IMapper例如,根据测试(这将意味着重复测试设置代码的一些工作,以确保对象从模拟映射器返回涉及到的对象的模拟映射器假装映射)。

  • 手动配置AutoMapper只需要映射,我想我将需要每个测试(很多工作和手段,我没有测试将真正使用的映射)。

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

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


    我可以倾向于同意#2。 你知道automapper的作品,你知道你的注射工作(得到测试的权利?:-))我会更专注于具体事情,不只是SomeClass.Property = AnotherClass.Property - 这些特殊情况应该测试不基本的复制功能。 不要测试框架的东西。

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

    关于Moq,语法很简单,不要过度使用它。 var obj = new Mock(); 然后设置你的属性,如obj.Setup(x => x.Property).returns(“你好”),除非你有一个更具体的问题? Moq也设置了它的所有属性,所以你可能甚至不需要automapper

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


    我赞成#2像杰瑞

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

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

    有点杂乱但方便。

    链接地址: http://www.djcxy.com/p/74395.html

    上一篇: Should I use AutoMapper in my unit tests?

    下一篇: How do I use AutoMapper with Ninject.Web.Mvc?