2017-09-27 1 views
2

Je tente de tester une unité qui utilise Automapper ProjectTo et je ne sais pas comment enregistrer les mappages dans MVC Core. J'utilise les tests unitaires intégrés.MVC Core 2.0 Test Unit et Automapper

Ce qui suit est mon test unitaire.

[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()); 
      } 

    } 
} 

Je reçois l'erreur suivante lorsque je lance le test:

Message: Méthode d'essai GotNext.Test.BusinessGenderServiceTest.GetTest a jeté exception:

System.InvalidOperationException: Mapper non initialisées . Appelez Initialize avec la configuration appropriée. Si vous essayez d'utiliser des instances de mappeur via un conteneur ou autrement, assurez-vous que vous n'avez aucun appel aux méthodes Mapper.Map statiques, et si vous utilisez les méthodes d'extension ProjectTo ou UseAsDataSource, assurez-vous de transmettre le fichier IConfigurationProvider approprié. exemple.

+1

1. Ce n'est pas un test unitaire, il est un test d'intégration, puisque vous n'êtes pas tester la classe seulement, mais aussi les dépendances externes (AutoMapper, DbContext) 2. il suffit d'utiliser automapper profils, où vous inscrivez vos inscriptions et vous les inscrivez dans votre test d'intégration – Tseng

+0

@Tseng concernant # 2) ... COMMENT «inscrivez-vous et inscrivez-vous à votre test d'intégration»? J'ai une classe Profils utilisée dans le code de production ... mais je n'ai aucune idée de comment l'utiliser dans le test d'intégration. Aidez-moi? :) –

+0

nm ... J'ai trouvé ceci: https://github.com/AutoMapper/AutoMapper/wiki/Configuration –

Répondre

2

J'ai été capable de résoudre ce problème en configurant et en initialisant automapper dans la méthode Init de chaque classe de test.

Par exemple

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

Créer une classe ou des classes qui permettent de configurer et AutoMapper instancient (et appeler des méthodes, le cas échéant) dans la classe Startup.

1

Vous pouvez configurer AutoMapper en classe comme ceci:

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

      })).CreateMapper(); 
     } 
    } 

Et ensuite l'utiliser dans startup.cs méthode ConfigureService

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

J'étais sous l'impression que startup.cs ne fonctionne pas dans un test unitaire. Cette hypothèse est-elle incorrecte? –

+0

Avez-vous projectreference à votre projet projet csproj dans le projet de test? Quelque chose comme ça: Kerni

0

J'ai eu cette même erreur ("System.InvalidOperationException: Mapper pas initialisé Appelez Initialize avec la configuration appropriée ... ") lorsque j'ai basculé par inadvertance/inconsciemment entre l'API Instance d'AutoMapper (que j'ai configurée) et l'API statique d'AutoMapper (que je n'ai pas configurée). En regardant de près la ligne de code signalée dans le message d'erreur, j'ai réalisé que j'avais utilisé Mapper.Map() majuscule au lieu de mapper minuscule. Map().