2016-07-22 31 views
6

Koduma IReadOnlyList uygulandığında, birim sınaması AutoMapperMappingException'u attı.AutoMapperMappingException - Eksik eşleme türü eşlemesi veya desteklenmeyen eşleme

Makaleler ve belgeler arasında gezinmek, benim tahminim AutoMapper'ın readonly türleri için özel kodlamaya ihtiyacı olduğunu tahmin ediyor. Bu neye benziyordu?

Not: Önerilen başka bir yayın olarak Mapper.AssertConfigurationIsValid(); kullanmayı denedim, ancak iyileştirme yok.

Test Adı: CreateOrder_ValidContract_CreatesNewOrder Testi FullName: Test Kaynak ACME.Maintenance.Domain.Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder: C: \ Users \ belgeler görsel stüdyo \ me \ 2015 \ ACME.Maintenance \ ACME Projeleri \ .Maintenance.Domain.Test \ OrderServiceTest.cs : çizgisi 65 Deney Sonucu: başarısız test Süresi: 0: 00: 00,0233941

Sonuç StackTrace: ACME.Maintenance de lambda_method de (Kapatma, ContractDto, Sonuç , ResolutionContext) .Domain.ContractService.GetById (String contractId) C: \ Users bana visual studio \ \ belgeleri \ Projeler \ 2015 \ ACME.Maintenance \ ACME.Maintenance.Domain ContractService.cs \: satır ACME.Maintenance.Domain.Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder de () C: \ Users \ me \ documents \ visual studio 2015 \ Projects \ ACME.Pişaj \ ACME.Maintenance.Domain.Test \ OrderServiceTest.cs: satır 69 Sonuç iletisi: Test yöntemi ACME.Maintenance.Domain. Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder istisnayı attı: AutoMapper.AutoMapperMappingException: Eksik harita yapılandırması veya desteklenmeyen eşleme.

Haritalama türleri: ContractDto -> Sözleşme

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 sınıfı:

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

Sözleşme sınıfı:

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

} 

ContractDto sınıfı:

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

} 
+0

Lütfen sh istisnanın tam metnine - yanlış eşlemenin ne olduğu ve sınıflarınız hakkında bilgi içerecektir. – stuartd

+0

Tam istisna ve sınıfları olan orijinal gönderi güncellendi. –

cevap

7

Senin sorunun Mapping.Initialize birden çok kez çağrıda olmasıdır: Daha önceki eşleştirmeleri üzerine yazıyorsunuz nedenle, bu katkı değildir ve siz ContractDto den Contract haritayı kaybediyor yüzden

Yani testin Setup yönteminde, bunu şöyle çağırmalıdır:

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