2016-07-22 165 views
6

当我在我的代码中实现了IReadOnlyList时,我的单元测试抛出AutoMapperMappingExceptionAutoMapperMappingException - 缺少类型映射配置或不支持的映射

从挖掘文章和文档,我的猜测是,AutoMapper需要readonly类型的特殊编码。这看起来像什么?

注:我试过Mapper.AssertConfigurationIsValid();作为另一篇文章的建议,但没有改进。

测试名称:CreateOrder_ValidContract_CreatesNewOrder测试 真实姓名:ACME.Maintenance.Domain.Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder 测试来源:C:\用户\我\的文档\ Visual Studio的 2015年\项目\ ACME.Maintenance \ ACME .Maintenance.Domain.Test \ OrderServiceTest.cs :线65测试结果:失败测试持续时间:0:00:00.0233941

结果堆栈跟踪:在lambda_method(封闭,ContractDto,合同 ,ResolutionContext)在 ACME.Maintenance .Domain.ContractService.GetById(String contractId )在 C:\用户\我\文件\视觉工作室 2015 \项目\ ACME.Maintenance \ ACME.Maintenance.Domain \ ContractService.cs: 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:行 69结果消息:测试方法 ACME.Maintenance.Domain。 Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder 引发异常:AutoMapper.AutoMapperMappingException:遗漏类型 映射配置或不支持的映射。

映射类型:ContractDto - >合同

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

} 
+0

请SH在这个异常的完整文本中 - 它将包含关于错误映射的信息 - 以及你的类。 – stuartd

+0

更新的原始帖子,完全例外和类。 –

回答

7

你的问题是,你在呼唤Mapping.Initialize多次:它不是添加剂,所以你覆盖以前的映射,这就是为什么你失去地图从ContractDtoContract

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

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