我正在将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();
}
答案 0 :(得分:0)
NullObjectMapper
个实例中的new
IObjectMapper
会在实例插入时(例如控制器)属性插入。
由于无法在单元测试中注入控制器,因此必须直接设置ObjectMapper
。
// using Abp.ObjectMapping;
var fooController = new FooController(mockFooService.Object);
fooController.ObjectMapper = LocalIocManager.Resolve<IObjectMapper>(); // Add this line
NullObjectMapper
在注入的实例中将[DependsOn(typeof(AbpAutoMapperModule))]
添加到您的测试模块中。
[DependsOn(typeof(AbpAutoMapperModule))]
public class MyTestModule : AbpModule
{
// ...
}