单元测试控制器方法时,为什么未初始化IObjectMapper?

时间:2019-04-03 16:42:31

标签: c# unit-testing dependency-injection aspnetboilerplate property-injection

我正在将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();
}

1 个答案:

答案 0 :(得分:0)

1。 NullObjectMapper个实例中的new

IObjectMapper会在实例插入时(例如控制器)属性插入。

由于无法在单元测试中注入控制器,因此必须直接设置ObjectMapper

// using Abp.ObjectMapping;

var fooController = new FooController(mockFooService.Object);
fooController.ObjectMapper = LocalIocManager.Resolve<IObjectMapper>(); // Add this line

2。 NullObjectMapper在注入的实例中

[DependsOn(typeof(AbpAutoMapperModule))]添加到您的测试模块中。

[DependsOn(typeof(AbpAutoMapperModule))]
public class MyTestModule : AbpModule
{
    // ...
}