【问题标题】:IMapper mock returning nullIMapper 模拟返回 null
【发布时间】:2018-11-07 13:53:55
【问题描述】:

我在 .net 核心中有一个应用程序,我在其中一项服务中使用了 automapper。现在的问题是我正在编写测试方法并模拟自动映射器,但它返回 null。 服务方法如下:

var users = _mapper.Map<IList<User>>(data);

这里是使用 Moq 进行模拟:

var userLogsList = new List<User>() { new User() {Id = "1234", Name= "Dummy User"}};
var mapperMock = new Mock<IMapper>();
mapperMock.Setup(m => m.Map<List<UserEntity>, IList<User>>(It.IsAny<List<UserEntity>>()))
.Returns(userLogsList);

现在这个模拟每次都返回 null。我做错了什么?

【问题讨论】:

  • 在您的起订量中,您实际上在模拟 IMapper 上的什么方法?

标签: unit-testing asp.net-core moq xunit


【解决方案1】:

您还可以考虑使用专门为测试配置的实际IMapper 实例。

// Arrange

//Configure mapping just for this test
var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<User, UserEntity>();
    cfg.CreateMap<UserEntity, User>();
});

var mapper = config.CreateMapper(); // IMapper to be injected into subject under test

//...

如果可以使用依赖项而没有太多的连锁效应和最少的配置,那么并不总是有理由必须使用模拟。

在这种情况下,配置比创建模拟要简单得多,并且无需额外工作即可获得依赖项的全部功能。

【讨论】:

    【解决方案2】:

    您似乎已将 Moq 设置为拦截对 IMapper.Map&lt;TSource, TDestination&gt;(TSource source) 重载的调用,但您的测试代码调用了 IMapper.Map&lt;TDestination&gt;(object source) 重载。

    你应该嘲笑后者:

    var userLogsList = new List<User>() { new User() {Id = "1234", Name= "Dummy User"}};
    var mapperMock = new Mock<IMapper>();
    mapperMock.Setup(m => m.Map<IList<User>>(It.IsAny<object>()))
              .Returns(userLogsList);
    

    我假设IMapper 的签名如here 所述。

    【讨论】:

    • 完全空白,我必须用 Mock 覆盖特定的重载。好地方!
    【解决方案3】:

    您必须调用自动映射器配置的原因是,UNIT 测试用例实例在主应用程序启动文件/配置之外运行。因此,必须在任何单元测试开始运行之前调用和设置自动映射器配置。理想情况下,您将它放在 TestInitialize 方法中。

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 2022-01-11
      • 1970-01-01
      • 2018-05-16
      • 2021-11-08
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多