AutoMapperMappingException-отсутствует конфигурация карты типа или неподдерживаемое сопоставление

когда я реализовал IReadOnlyList в моем коде мой модульный тест бросил AutoMapperMappingException.

от копания в статьях и документации, я предполагаю, что AutoMapper нуждается в специальном кодировании для readonly типы. Как это будет выглядеть?

Примечание: я пробовал Mapper.AssertConfigurationIsValid(); как предложил другой пост, но никаких улучшений.

Имя Теста: CreateOrder_ValidContract_Createsneworder Тест Полное имя: ВЕРШИНА.Поддержка.Домен.Тест.OrderServiceTest.CreateOrder_ValidContract_Createsneworder Источник испытания: C:\Users\me\documents\visual студия 2015\проекты\ACME.Ремонт\ "АКМЕ".Поддержка.Домен.Тест\OrderServiceTest.цезий : линия 65 итоговый тест: не тест Продолжительность: 0:00:00.0233941

трассировка стека результат: на lambda_method(закрытие , ContractDto , договор , ResolutionContext) в ВЕРШИНА.Поддержка.Домен.ContractService.GetById (строка contractId) в C:\Users\me\documents\visual студия 2015\проекты\ACME.Ремонт\ "АКМЕ".Поддержка.Домен\ContractService.cs: линия 34 at ВЕРШИНА.Поддержка.Домен.Тест.OrderServiceTest.CreateOrder_ValidContract_Createsneworder() в C:\Users\me\documents\visual студия 2015\проекты\ACME.Ремонт\ "АКМЕ".Поддержка.Домен.Тест\OrderServiceTest.cs: линия 69 сообщение о результате: метод испытания ВЕРШИНА.Поддержка.Домен.Тест.OrderServiceTest.CreateOrder_ValidContract_Createsneworder бросил исключение: AutoMapper.AutoMapperMappingException: отсутствует тип конфигурация карты или неподдерживаемое отображение.

типы отображения: ContractDto - > контракт

ACME.Поддержка.Домен.DTO.ContractDto - > "АКМЕ".Поддержка.Домен.Контракт

Mapper.Initialize(cfg => cfg.CreateMap<ContractDto, Contract>());
Mapper.Initialize(cfg => cfg.CreateMap<PartDto, Part>());
[TestMethod]
public void CreateOrder_ValidContract_CreatesNewOrder()
    {
        //Arrange
        var orderService = new OrderService();
        var contractService = new ContractService(_contractRepository);
        var contract = contractService.GetById(ValidContractId);

        // Act
        var newOrder = orderService.CreateOrder(contract);

        // Assert
        Assert.IsInstanceOfType(newOrder, typeof(Order));

        Guid guidOut;
        Assert.IsTrue(Guid.TryParse(newOrder.OrderId, out guidOut));

        Assert.AreEqual(newOrder.Status, ContractStatus.New);
        Assert.IsInstanceOfType(newOrder.Items, typeof(IReadOnlyList<OrderItem>));

    }

ContractService класс:

public Contract GetById(string contractId)
    {
        var contractDto = _contractRepository.GetById(contractId);
        var contract = Mapper.Map<ContractDto, Contract>(contractDto);
        Mapper.AssertConfigurationIsValid();
        return contract;
    }

класс:

public class Contract
{
    public string ContractId { get; set; }
    public DateTime ExpirationDate { get; set; }

}

ContractDto класс:

public class ContractDto
{
    public string ContractId { get; set; }
    public DateTime ExpirationDate { get; set; }

}

1 ответов


ваша проблема в том, что ты называешь Mapping.Initialize несколько раз: это не добавка, поэтому вы перезаписываете предыдущие сопоставления, и именно поэтому вы теряете карту из ContractDto to Contract

а в Setup метод вашего теста, вы должны назвать его так:

Mapper.Initialize(cfg => {
     cfg.CreateMap<ContractDto, Contract>();
     cfg.CreateMap<PartDto, Part>();
});