2017-09-27 3 views
2

Ich versuche Unit-Test eine Methode, die Automapper ProjectTo verwendet und ich bin mir nicht sicher, wie die Zuordnungen in MVC Core registrieren. Ich benutze den eingebauten Komponententest.MVC Core 2.0 Einheit Testing und Automapper

Folgendes ist mein Komponententest.

[TestClass] 
public class BusinessGenderServiceTest 
{ 
    [ClassInitialize] 
    public static void Init(TestContext context) 
    { 

    } 
    [TestMethod] 
    public void GetTest() 
    { 
     var options = new DbContextOptionsBuilder<GotNextDbContext>() 
      .UseInMemoryDatabase(databaseName: "GetTest") 
      .Options; 

     using (var context = new GotNextDbContext(options)) 
     { 


      context.GenderLanguage.Add(new GenderLanguage { Id = 1, Name = "Male", Language = 1 }); 
      context.GenderLanguage.Add(new GenderLanguage { Id = 2, Name = "Female", Language = 1 }); 
      context.GenderLanguage.Add(new GenderLanguage { Id = 3, Name = "Hombre", Language = 2 }); 
      context.GenderLanguage.Add(new GenderLanguage { Id = 4, Name = "Hombre", Language = 2 }); 
      context.SaveChanges(); 
     } 
      using (var context = new GotNextDbContext(options)) 
      { 
       var service = new GenderService(context); 
       var result = service.Get(1); 
       Assert.AreEqual(2, result.Count()); 
      } 

    } 
} 

Ich erhalte die folgende Fehlermeldung, wenn ich den Test ausführen:

Nachricht: Prüfnorm GotNext.Test.BusinessGenderServiceTest.GetTest warf Ausnahme:

System.InvalidOperationException: Mapper nicht initialisiert . Rufen Sie Initialize mit der entsprechenden Konfiguration auf. Wenn Sie versuchen, Mapper-Instanzen über einen Container oder auf andere Weise zu verwenden, stellen Sie sicher, dass Sie keine Aufrufe der statischen Mapper.Map-Methoden haben. Wenn Sie die Erweiterungsmethoden ProjectTo oder UseAsDataSource verwenden, stellen Sie sicher, dass Sie den entsprechenden IConfigurationProvider übergeben Beispiel.

+1

1. Das ist nicht ein Gerät zu testen, es ist ein Integrationstest, da Sie nicht die Klasse nur testen, sondern auch externe Abhängigkeiten (AutoMapper, DbContext) 2. nur AutoMapper Profile verwenden, wo Sie geben Ihre Registrierungen ein und registrieren sie dann in Ihrem Integrationstest – Tseng

+0

@Tseng bezüglich # 2) ... WIE "setzen Sie Ihre Registrierungen ein und registrieren sie dann in Ihrem Integrationstest"? Ich habe eine Profiles-Klasse, die im Produktionscode verwendet wird ... aber ich habe keine Ahnung, wie ich sie im Integrationstest verwenden soll. Hilfe? :) –

+0

nm ... Ich habe folgendes gefunden: https://github.com/AutoMapper/AutoMapper/wiki/Configuration –

Antwort

2

Ich konnte dieses Problem lösen, indem ich Autoadapter in der Init-Methode jeder Testklasse konfigurierte und initialisierte.

Zum Beispiel

[ClassInitialize] 
    public static void Init(TestContext testContext) 
    { 
     var mappings = new MapperConfigurationExpression(); 
     mappings.AddProfile<LocationProfile>(); 
     mappings.AddProfile<CompanyProfile>(); 
     Mapper.Initialize(mappings); 
    } 
0

eine Klasse oder Klassen erstellen, die AutoMapper konfigurieren und instanziiert (und Methoden aufrufen, wo zutreffend) in der Startup Klasse.

1

Sie können AutoMapper in Klasse wie folgt konfiguriert werden:

public static class AutoMapperConfig 
    { 
     public static IMapper Initialize() 
     { 
      return new MapperConfiguration((cfg => 
      { 
       cfg.CreateMap<User, UserDto>(); 

      })).CreateMapper(); 
     } 
    } 

Und es nächsten Einsatz in startup.cs ConfigureService Methode

services.AddSingleton(AutoMapperConfig.Initialize()); 
+0

Ich hatte den Eindruck, dass startup.cs nicht in einem Unit Test läuft. Ist diese Annahme falsch? –

+0

Haben Sie Projektreferenz zu Ihrer Projekt csproj Datei im Testprojekt? Etwas wie das: Kerni

0

ich diesen gleichen Fehler bekam ("System.InvalidOperationException: Mapper nicht initialisiert. Call Initialize mit der entsprechenden Konfiguration. ... "), als ich versehentlich/hirnlos zwischen der Instanz-API von AutoMapper (die ich konfiguriert hatte) und der statischen API von AutoMapper (die ich NICHT konfiguriert hatte) wechselte.

Bei genauerer Betrachtung der Codezeile, die in der Fehlermeldung angezeigt wird, erkannte ich, dass ich in Großbuchstaben 'M' Mapper.Map() anstelle meines Instanzelements in Kleinbuchstaben 'm' mapper.Map() verwendete.