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

13

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

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

动作方法使用 IMapper 将领域对象映射到 ViewModel 对象,然后再映射回来,旨在保持 DRY 并使动作方法简洁。

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

  1. 使用正确的绑定配置 AutoMapper(它们使用 AutoMapper 档案创建,因此可在网站和单元测试项目之间进行测试并重复使用),并将其作为合适的 AutoMapper 实现传递给 IMapper

  2. 根据测试情况,传入 IMapper 实例的模拟对象 (我正在使用 Moq),这意味着需要在测试设置代码中复制一些工作,以确保模拟 mapper 返回的对象与模拟 mapper 假装映射的对象相关联)。

  3. 手动配置 AutoMapper,只配置我认为每个测试需要的映射 (需要很多工作,并意味着我不测试真正使用的映射)。

关于在单元测试中使用基础结构代码的看法是什么?在什么时候会成为集成测试(即测试 AutoMapper 和我的控制器的集成)?

感觉 2 是最纯粹的观点,尽管我认为我需要学习更多关于 Moq 如何返回与其模仿的方法传入的实际值相关的值。

2个回答

9

我支持像jeriley一样的#2。

如果需要根据传递给它的值返回对象,可以按以下方式编写设置:

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

有点凌乱但很方便。


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

6
我倾向于同意第二点。你知道自动映射如何工作,你知道你的注入也可以(测试过了对吧?:-))。我会更关注细节,不仅仅是 SomeClass.Property = AnotherClass.Property 这样的基本复制功能应该被测试,而是应该测试那些特殊情况。不要测试框架相关的东西。
至于更多的测试代码-我认为完全没问题。测试应该在给定的单元测试中设置(也要合理),只针对特定的单元进行测试。
关于Moq,语法很简单,不要想太多。var obj = new Mock();然后像obj.Setup(x => x.Property).returns("hello")这样设置属性,除非你有更具体的问题?Moq还可以设置它上面的所有属性,所以你甚至可能不需要自动映射。
-edit- 找到了,是obj.SetupAllProperties()。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接