【问题标题】:AutoMapperMappingException - Missing type map configuration or unsupported mappingAutoMapperMappingException - 缺少类型映射配置或不支持的映射
【发布时间】:2016-11-26 17:31:03
【问题描述】:

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

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

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

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

结果 StackTrace:在 lambda_method(Closure , ContractDto , Contract , 分辨率上下文) 在 ACME.Maintenance.Domain.ContractService.GetById(String contractId) in C:\用户\我\文档\视觉工作室 2015\Projects\ACME.Maintenance\ACME.Maintenance.Domain\ContractService.cs:line 34 在 ACME.Maintenance.Domain.Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder() 在 C:\Users\me\documents\visual studio 2015\Projects\ACME.Maintenance\ACME.Maintenance.Domain.Test\OrderServiceTest.cs:line 69 结果消息:测试方法 ACME.Maintenance.Domain.Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder 抛出异常:AutoMapper.AutoMapperMappingException:缺少类型 映射配置或不支持的映射。

映射类型:ContractDto -> Contract

ACME.Maintenance.Domain.DTO.ContractDto -> ACME.Maintenance.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>));

    }

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

}

【问题讨论】:

  • 请显示异常的全文 - 其中将包含有关错误映射的信息 - 以及您的类。
  • 更新了原始帖子,包含完整的例外和课程。

标签: c# automapper


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 2020-07-07
    • 2019-03-01
    • 2017-04-16
    • 2015-09-22
    • 1970-01-01
    相关资源
    最近更新 更多