c# – AutoMapperMappingException – 缺少类型映射配置或不支持的映射

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

从挖掘文章和文档,我的猜测是AutoMapper需要对只读类型进行特殊编码.这会是什么样的?

注意:我尝试了Mapper.AssertConfigurationIsValid();正如另一篇文章所建议,但没有任何改进

Test Name: CreateOrder_ValidContract_CreatesNewOrder Test
FullName: Acme.Maintenance.Domain.Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder
Test Source: C:\Users\me\documents\visual studio
2015\Projects\Acme.Maintenance\Acme.Maintenance.Domain.Test\OrderServiceTest.cs
: line 65 Test Outcome: Failed Test Duration: 0:00:00.0233941

Result StackTrace: at lambda_method(Closure,ContractDto,Contract
,ResolutionContext ) at
Acme.Maintenance.Domain.ContractService.GetById(String contractId) in
C:\Users\me\documents\visual studio
2015\Projects\Acme.Maintenance\Acme.Maintenance.Domain\ContractService.cs:line
34 at
Acme.Maintenance.Domain.Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder()
in C:\Users\me\documents\visual studio
2015\Projects\Acme.Maintenance\Acme.Maintenance.Domain.Test\OrderServiceTest.cs:line
69 Result Message: Test method
Acme.Maintenance.Domain.Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder
threw exception: AutoMapper.AutoMapperMappingException: Missing type
map configuration or unsupported mapping.

Mapping types: 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; }

}

解决方法

你的问题是你多次调用Mapping.Initialize:它不是附加的,所以你要覆盖以前的映射,这就是你将地图从ContractDto丢失到Contract的原因

因此,在测试的Setup方法中,您应该像这样调用它:

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

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...