Mapper уже инициализировал проблему при использовании Automapper и xUnit для модульного тестирования - PullRequest
0 голосов
/ 10 апреля 2019

Я немного новичок в модульном тестировании с xUnit, и у меня есть некоторые проблемы с AutoMapper. Я получаю Mapper уже инициализирован проблема.

Я использую Automapper 8.0.0., ASP.NET Core 2.2 и xUnit 2.4.1.

Я пишу юнит-тесты для моих контроллеров. У меня есть модульные тесты в 3 разных классах. Каждый класс выглядит в основном так:

/* Constructor */
public ControllerGetTests()
{
    /// Initialize AutoMapper
    AutoMapper.Mapper.Reset();
    MapperConfig.RegisterMaps();

    /* Some mocking code here using Moq */

    _controller = new MyController();
}


[Fact]
public async void Get_WhenCalled_ReturnsOkResult()
{
    // Act
    var okResult = await _controller.Get();

    // Assert
    Assert.IsType<OkObjectResult>(okResult);
}

/* etc. */

Все три класса похожи и являются базовыми тестами для контроллеров. Все контроллеры используют AutoMapper. Я использую тот же статический класс MapperConfig для регистрации моих отображений:

public static class MapperConfig
{
    public static void RegisterMaps()
    {
        AutoMapper.Mapper.Initialize(config =>
        {
            config.CreateMap<SomeClass, SomeClassViewModel>();    
            config.CreateMap<SomeClassViewModel, SomeClass>();

        });
    }
}

Я вызываю этот метод в конструкторе каждого из 3 тестовых классов. Перед вызовом я вызываю Mapper.Reset () - некоторые ответы здесь предполагают, что: Automapper - Mapper уже инициализировал ошибку

В Test Explorer в VS, когда я выбираю один класс тестирования и выбираю «Выполнить выбранные тесты», они все проходят. Однако при выборе основного «Выполнить все» некоторые тесты завершаются с сообщением Mapper уже инициализирован . И каждый раз это разные тесты в разных классах, которые терпят неудачу.

Я предполагаю, что разные потоки создаются для разных методов, но все они пытаются инициализировать один и тот же экземпляр mapper, который выдает ошибку.

Однако я не уверен, где я должен вызывать инициализацию в одном (и только одном) месте и использовать эту же инициализацию для всех моих тестовых классов (как я делаю в Startup.cs Configure метод).

Заранее спасибо.

...