Почему IObjectMapper не инициализируется при модульном тестировании метода контроллера? - PullRequest
0 голосов
/ 03 апреля 2019

Я использую шаблон 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?


Я создал проект репро. См ссылка . Существует тест под названием 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 голосов
/ 13 апреля 2019

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
{
    // ...
}
...