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# - 具有复杂映射的 IConfigurationSection 集合中的 AutoMapper 映射

c# - .NET WebSockets 强行关闭,尽管连接保持事件状态

c# - 获取类层次结构中的所有基本属性声明

c# - Silverlight 3 中的 TreeView 选择问题

java - 简单的 Java AMQP 服务器

unit-testing - 让 Visual Studio 2013 Express for Desktop 检测到 F# 测试

c# - 更流畅的绘图笔

java - 如何将模拟注入(inject)到 Spring 安全类中

sql-server-2008 - 我的 Entity Framework 生成的 SQL 是否执行了两次?

c# - 保存具有多个父项的 EF 实例