我正在使用ASP.NET Boilerplate模板用于ASP.NET Core。我有一些应用程序服务,我已成功进行单元测试。
我现在想测试一个使用这些应用程序服务的控制器方法。控制器方法包括这样的映射操作:
var client = ObjectMapper.Map<ClientModel>(clientResponse.ClientSummary);
执行此方法时,测试失败并出现异常:
消息:Abp.AbpException:应该实现Abp.ObjectMapping.IObjectMapper以映射对象。
有趣的是,堆栈跟踪以NullObjectMapper.Map
开头。
我在AbpAutoMapper
模块中使用的单元测试模块中使用与Web.Mvc
相同的初始化:
Configuration.Modules.AbpAutoMapper().Configurators.Add(cfg =>
{
cfg.AddProfiles(typeof(PortalTestModule).GetAssembly());
});
但是,在MVC应用程序的上下文中执行时,映射操作不会导致异常。
我在Test
项目中与AutoMapper相关的初始化是什么?
我创建了一个repro项目。见link。有一个名为GetFoos_Test
的测试,测试Index()
上的控制器方法FoosController
。
public async Task GetFoos_Test()
{
var mockFooService = new Mock<IFooAppService>();
// ...
var fooController = new FooController(mockFooService.Object);
var result = await fooController.Index();
result.ShouldNotBeNull();
}
NullObjectMapper
in new
instances当注入实例时,IObjectMapper
被属性注入到实例(例如控制器)中。
由于无法在单元测试中注入控制器,因此必须直接设置ObjectMapper
。
// using Abp.ObjectMapping;
var fooController = new FooController(mockFooService.Object);
fooController.ObjectMapper = LocalIocManager.Resolve<IObjectMapper>(); // Add this line
NullObjectMapper
in injected instances将[DependsOn(typeof(AbpAutoMapperModule))]
添加到您的测试模块。
[DependsOn(typeof(AbpAutoMapperModule))]
public class MyTestModule : AbpModule
{
// ...
}