xUnit测试asp net core映射器未初始化

时间:2019-06-05 01:04:27

标签: c# unit-testing testing xunit

我正在测试该方法,最终可以映射到我的DTO

public async Task<IActionResult> Get()
        {
            var currencies = await _repository.GetCurrencies().ToListAsync().ConfigureAwait(false);
            if (currencies.Count == 0)
                return NoContent();

            return Ok(currencies.ToDto());
        }

此方法返回以下错误:

  

消息:System.InvalidOperationException:映射器未初始化。   用适当的配置调用初始化。如果你想   通过容器或其他方式使用映射器实例,请确保您   没有对静态Mapper.Map方法的任何调用,如果您   使用ProjectTo或UseAsDataSource扩展方法,请确保您   传入适当的IConfigurationProvider实例。

我使用静态方法来执行自动映射器

public static List<CurrencyDTO> ToDto(this List<Currency> model)
        {
            return Mapper.Map<List<Currency>, List<CurrencyDTO>>(model);
        }

当我仅运行此测试时,它就会通过,但是当我挤压所有人时,它会说话

我已经尝试过让构建器初始化映射器,但继续出错,只有在单独运行时才通过测试

public class CurrenciesControllerTest
    {
        public CurrenciesControllerTest()
        {
            AutoMapperConfig.RegisterMappings();
        }
        private Mock<IReimbursementRepository> _repository = new Mock<IReimbursementRepository>();
        [Fact]
          public async Task Should_return_all_currencies()
        {
            var mock = Currencyfactory().AsQueryable().BuildMock();
            _repository.Setup(x => x.GetCurrencies()).Returns(mock.Object);

            var controller = new CurrenciesController(_repository.Object);
            var response = await controller.Get().ConfigureAwait(false) as OkObjectResult;`enter code here`

            Assert.Equal(response.StatusCode, (int)HttpStatusCode.OK);
        }
    }

1 个答案:

答案 0 :(得分:0)

我的解决方案,配置AutoMapperConfig

 public class AutoMapperConfig
    {
        public static object thisLock = new object();
        public static void Initialize()
        {
            lock (thisLock)
            {
                AutoMapper.Mapper.Reset();
                AutoMapper.Mapper.Initialize(cfg => { });
            }
        }
    }
}