AutoMapperMappingException-缺少类型映射配置或不受支持的映射

本文关键字:映射 支持 配置 类型 AutoMapperMappingException- | 更新日期: 2023-09-27 17:58:27

当我在代码中实现IReadOnlyList时,我的单元测试抛出了一个AutoMapperMappingException

通过对文章和文档的深入研究,我猜测AutoMapper需要对readonly类型进行特殊编码。这会是什么样子?

注意:我按照另一篇帖子的建议尝试了Mapper.AssertConfigurationIsValid();,但没有任何改进。

测试名称:CreateOrder_ValidContract_CreatesNewOrder测试全名:ACME.Maintenance.Domain.Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder测试源:C:''Users''me''documents''visualstudio2015''Projects''ACME.Maintenance''ACME.Maintenance.Domain.Test''OrderServiceTest.cs:第65行测试结果:失败测试持续时间:0:00:00.0233941

结果StackTrace:在lambda_method(闭包,ContractDto,Contract,ResolutionContext)中的ACME.Maintenance.Domain.CContractService.GetById(字符串contractId)C: ''用户''我''文档'' visual studio2015''Projects''ACME.Maintenance''ACME.Maintenance.Domain''ControlService.cs:line34ACME.Maintenance.Domain.Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder()在C:''Users''me''documents''visualstudio中2015''Projects''ACME.Maintenance''ACME.Maintenance.Domain.Test''OrderServiceTest.cs:line69结果消息:测试方法ACME.Maintenance.Domain.Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder引发异常:AutoMapper.AutoMapperMappingException:缺少类型映射配置或不支持的映射。

映射类型:ContractDto->Contract

ACME.Maintenance.Domain.DTO.ContractDto->ACME.Maintinance.Domain.Contract

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>));
    }

合同服务类别:

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; }
}

合同类别:

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

AutoMapperMappingException-缺少类型映射配置或不受支持的映射

您的问题是多次调用Mapping.Initialize:它不是可加的,所以您覆盖了以前的映射,这就是为什么您丢失了从ContractDtoContract 的映射

因此,在测试的Setup方法中,您应该这样称呼它:

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