为什么在单元测试控制器方法时IObjectMapper没有初始化?

问题描述 投票:0回答:1

我正在使用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();
}
c# unit-testing dependency-injection aspnetboilerplate property-injection
1个回答
0
投票

1. NullObjectMapper in new instances

当注入实例时,IObjectMapper被属性注入到实例(例如控制器)中。

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

// using Abp.ObjectMapping;

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

2. NullObjectMapper in injected instances

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

[DependsOn(typeof(AbpAutoMapperModule))]
public class MyTestModule : AbpModule
{
    // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.