2011-01-12 82 views
7

我正在为ASP.NET MVC控制器方法编写单元测试。我应该在单元测试中使用AutoMapper吗?

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

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

在我的单元测试,我

  1. 配置AutoMapper用正确的绑定(他们使用AutoMapper配置文件,所以可测试和网站和单元测试项目之间重复使用内置),并应通过在作为适当的AutoMapper实现IMapper

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

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

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

感觉就像2是纯粹的视图,虽然我认为我需要更多地了解Moq以及如何让它返回与传递给它嘲笑的方法的实际值有关的值。

回答

6

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

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

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

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

4

我赞成的#2像jeriley

添加到起订量,如果需要返回基于传递给它的值的对象,你可以写你的设置,像这样:

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

       return product 
      });

有点凌乱但方便。

+0

如果您使用存储库模式,我可以指出您... http://rileytech.net/post/2010/08/17/Mock-Utility-creating-those-basic-services.aspx - - 使用最后两个文件或将其用作完整示例:-) – jeriley 2011-01-12 13:23:38

相关问题