2016-07-22 4 views
6

Wenn ich IReadOnlyList in meinem Code implementierte, warf mein Einheitstest AutoMapperMappingException.AutoMapperMappingException - Fehlende Typzuordnungskonfiguration oder nicht unterstützte Zuordnung

Von graben durch Artikel und Dokumentation, meine Vermutung ist, dass AutoMapper spezielle Codierung für readonly Typen benötigt. Wie würde das aussehen?

Hinweis: Ich habe versucht Mapper.AssertConfigurationIsValid(); als ein anderer Beitrag vorgeschlagen, aber keine Verbesserungen.

Testname: CreateOrder_ValidContract_CreatesNewOrder-Test Fullname: ACME.Maintenance.Domain.Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder -Test Quelle: C: \ Benutzer \ me \ Dokumente Visual Studio \ 2015 \ Projects \ ACME.Maintenance \ ACME .Maintenance.Domain.Test \ OrderServiceTest.cs : Linie 65 Test-Ergebnis: Failed Test Dauer: 0: 00: 00,0233941

Ergebnis Stacktrace: bei lambda_method (Closure, ContractDto, Vertrag , ResolutionContext) bei ACME.Maintenance .Domain.ContractService.GetById (String contractId) In C: \ Benutzer \ me \ Dokumente \ Visual Studio 2015 \ Projects \ ACME.Maintenance \ ACME.Maintenance.Domain \ ContractService.cs: Linie 34 bei ACME.Maintenance.Domain.Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder () in C: \ Benutzer \ ich \ Dokumente \ Visual Studio 2015 \ Projekte \ ACME.Maintenance \ ACME.Maintenance.Domain.Test \ OrderServiceTest.cs: Zeile 69 Ergebnis Nachricht: Testmethode ACME.Maintenance.Domain. Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder warf Ausnahme: AutoMapper.AutoMapperMappingException: Fehlender Typ Kartenkonfiguration oder nicht unterstützte Zuordnung.

Mapping-Typen: ContractDto -> Vertrag

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

    } 

Bauauftrags Klasse:

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

Vertragsklasse:

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

} 

ContractDto Klasse:

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

} 
+0

Bitte sh Der vollständige Text der Ausnahme - der Informationen darüber enthält, was das Mismapping ist - und Ihre Klassen. – stuartd

+0

Aktualisierter Originalbeitrag mit vollständiger Ausnahme und Klassen. –

Antwort

7

Ihr Problem ist, dass Sie Mapping.Initialize mehrere Male anrufen: es nicht additiv ist, so dass Sie die vorherigen Zuordnungen überschreiben, und das ist, warum Sie die Karte ContractDto-Contract verlieren

So in der Setup Methode Ihres Tests, sollten Sie es so nennen:

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