2016-07-22 6 views
6

Kiedy wdrożony IReadOnlyList w moim kodu, mój testów jednostkowych rzucił AutoMapperMappingException.AutoMapperMappingException - Missing konfiguracja typu mapy lub nieobsługiwane odwzorowanie

Od kopania poprzez artykułów i dokumentacji, domyślam się, że AutoMapper potrzebuje specjalnego kodowania dla readonly typów. Jak by to wyglądało?

Uwaga: próbowałem Mapper.AssertConfigurationIsValid(); jako kolejny post sugeruje, ale nie ma poprawy.

Nazwa testu: CreateOrder_ValidContract_CreatesNewOrder test FullName: ACME.Maintenance.Domain.Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder testu Źródło: C: \ Users \ mi \ Documents \ visual studio 2015 \ Projects \ ACME.Maintenance \ ACME .Maintenance.Domain.Test \ OrderServiceTest.cs : linia 65 test Wynik: Niepowodzenie testu Czas trwania: 0: 00: 00,0233941

Wynik StackTrace: co lambda_method (zamknięcie, ContractDto, Kontrakt , ResolutionContext) w ACME.Maintenance .Domain.ContractService.GetById (String contractId) W C: \ Users \ me \ Documents \ Visual Studio 2015 \ Projects \ ACME.Maintenance \ ACME.Maintenance.Domain \ ContractService.cs: Linia 34 w ACME.Maintenance.Domain.Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder () w C: \ Users \ me \ documents \ visual studio 2015 \ Projects \ ACME.Maintenance \ ACME.Maintenance.Domain.Test \ OrderServiceTest.cs: line 69 Komunikat o wyniku: Metoda testu ACME.Maintenance.Domain. Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder Wyrzucony wyjątek: AutoMapper.AutoMapperMappingException: brak typu konfiguracja mapy lub nieobsługiwane mapowanie.

rodzaje mapowania: ContractDto -> Kontrakt

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

    } 

klasa zamówienia:

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

kontraktu:

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

} 
klasa

ContractDto:

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

} 
+0

Proszę sh ow pełnym tekście wyjątku - który będzie zawierał informacje o tym, czym jest niedopasowanie - i twoje zajęcia. – stuartd

+0

Zaktualizowany oryginalny post z pełnym wyjątkiem i klas. –

Odpowiedz

7

Twoim problemem jest to, że dzwonisz Mapping.Initialize wielokrotnie: to nie jest dodatkiem, więc są nadpisywania poprzednich mapowań, i dlatego tracą mapę z ContractDto do Contract

więc w sposobie testu Setup należy nazwać tak:

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