【问题标题】:Should I use AutoMapper in my unit tests?我应该在单元测试中使用 AutoMapper 吗?
【发布时间】:2011-06-07 13:11:12
【问题描述】:

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

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

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

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

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

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

  3. 仅使用我认为每次测试所需的映射手动配置 AutoMapper(大量工作,这意味着我不会测试真正使用的映射)。

    李>

对于在单元测试中使用基础架构代码有何看法?它在什么时候成为集成测试(即测试 AutoMapper 和我的控制器的集成)?

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

【问题讨论】:

    标签: c# unit-testing automapper


    【解决方案1】:

    我倾向于同意#2。你知道自动映射器工作,你知道你的注入工作(得到测试对吗?:-))我会更多地关注细节,不仅仅是 SomeClass.Property = AnotherClass.Property - 那些特殊情况不应该被测试基本复印功能。不要测试框架的东西。

    至于更多的测试代码——我觉得完全可以。应该在给定的测试中(也在合理范围内)为给定的单元设置测试。

    关于起订量,语法很简单,不要想太多。 var obj = new Mock();然后设置您的属性,如 obj.Setup(x => x.Property).returns("hello") 除非您有更具体的问题? Moq 还设置了所有属性,因此您甚至可能不需要自动映射器

    -edit-找到了,是obj.SetupAllProperties();

    【讨论】:

      【解决方案2】:

      我赞成像 jeriley 这样的 #2

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

      mockObject.Setup(x => x.MapObject(It.IsAny())
                .Returns((ProductDto productDto) =>
                 {
                     var 产品 = 新产品()
                     {
                         Id = productDto.Id,
                         名称 = productDto.Name
                     };
      
                     退货
                 });

      有点乱但很方便。

      【讨论】:

      猜你喜欢
      • 2010-10-02
      • 2016-07-23
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      相关资源
      最近更新 更多