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

标签 c# unit-testing automapper

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

这些 Controller 依赖于 IMapper - 我创建的用于抽象 AutoMapper 的接口(interface),使用 CaSTLe Windsor 通过构造函数注入(inject)传入。

Action 方法使用 IMapper 将领域对象映射到 ViewModel 对象,然后再映射回来,目的是保持事物干燥并保持 action 方法简洁。

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

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

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

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

    <

对在单元测试中使用基础设施代码有何看法?它在什么时候成为集成测试(即测试 AutoMapper 和我的 Controller 的集成)?

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

最佳答案

我赞成像 jeriley 这样的#2

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

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

               return product
           });

有点乱,但很方便。

关于c# - 我应该在单元测试中使用 AutoMapper 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4664287/

相关文章:

c# - C#中如何解决类名冲突问题

ruby-on-rails - Controller 测试,用户需要登录每个测试单元

javascript - Sinon 的意外断言错误

c# - 启动时未加载 Automapper 配置文件?

c# - 将对象复制到对象(使用 Automapper?)

c# - 从 ViewModel 映射回 DTO 时出现 AutoMapper 问题

javascript - 强制浏览器在 asp.net 应用程序中获取最新的 js 和 css 文件

c# - 虚拟方法比调用非虚拟方法慢

c# - 缺少属性时如何强制 System.Text.Json 序列化程序抛出异常?

unit-testing - 我如何让 Guice 和 TestNg 一起玩,a-la-AtUnit 风格