IMapper 模拟返回 null
IMapper mock returning null
我在 .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。我做错了什么?
您似乎已将 Moq 设置为拦截对 IMapper.Map<TSource, TDestination>(TSource source)
重载的调用,但您的测试代码调用了 IMapper.Map<TDestination>(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 所述。
您也可以考虑使用专门为测试配置的实际 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
//...
如果一个依赖项可以在没有太多影响和最小配置的情况下使用,那么并不总是有理由必须使用模拟。
在这种情况下,配置比创建模拟要简单得多,您无需额外工作即可获得依赖项的全部功能。
您必须调用自动映射器配置的原因是,UNIT 测试用例实例 运行 在主应用程序之外启动 files/configs。因此,必须在任何单元测试开始 运行 之前调用和设置自动映射器配置。理想情况下,您将它放在 TestInitialize 方法中。
我在 .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。我做错了什么?
您似乎已将 Moq 设置为拦截对 IMapper.Map<TSource, TDestination>(TSource source)
重载的调用,但您的测试代码调用了 IMapper.Map<TDestination>(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 所述。
您也可以考虑使用专门为测试配置的实际 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
//...
如果一个依赖项可以在没有太多影响和最小配置的情况下使用,那么并不总是有理由必须使用模拟。
在这种情况下,配置比创建模拟要简单得多,您无需额外工作即可获得依赖项的全部功能。
您必须调用自动映射器配置的原因是,UNIT 测试用例实例 运行 在主应用程序之外启动 files/configs。因此,必须在任何单元测试开始 运行 之前调用和设置自动映射器配置。理想情况下,您将它放在 TestInitialize 方法中。