2016-07-23 1 views
0

J'ai une application ASP.NET MVC Core pour laquelle j'écris des tests unitaires. J'utilise InMemoryDatabase et ça marche très bien. Je veux initialiser la base de données une fois pour le test. Donc, j'ai une classe statique:Réutilisation de InMemoryDatabase dans des tests unitaires

public static class DbInitialize { 
    private static MyDbContext _db; 

    public static MyDbContext Initialize() { 
     if (_db != null) { 
      return _db; 
     } 
     DbContextOptionsBuilder<MyDbContext> optionsBuilder = new DbContextOptionsBuilder<MyDbContext>(); 
     optionsBuilder.UseInMemoryDatabase(); 
     _db = new MyDbContext(optionsBuilder.Options); 
     ....... (populating mock data) ............. 
     _db.SaveChanges(); 
     return _db; 
    } 
} 

Fonctionne très bien pour une classe d'essai unique (par exemple, HomeControllerTests) et tous ses tests spécifiques. Cependant, si j'ai une autre classe de test (CustomerControllerTests) et j'appelle DbInitialize.Initialize() - je vois que _db est null, mais la base de données n'a pas été détruite - je reçois une erreur de clé pendant SaveChanges(). Y at-il une meilleure façon d'initialiser la base de données seulement une fois, et obtenir une "chaîne de connexion" (faute de meilleur mot) si elle est déjà en marche?

+0

Que se passe-t-il si vous recréer le 'DbContext' à chaque fois avec vos options (sans les données)? –

+0

@GabrielGM - Je ne suis pas sûr de comprendre votre question. Si je crée DbContext sans les données du tout - rien ne va arriver, sauf que je n'ai pas les données, et les tests unitaires échouent évidemment. – Felix

+0

Vous dites que votre '_db' est nul, même s'il existe en mémoire. Quand cela arrive, pouvez-vous recréer le '_db'. Je veux dire, créez et semez la première fois. Après cela, créez simplement. –

Répondre

0

Il s'avère que xUnit répond exactement à cette situation - Collection Fixture. J'ai suivi les instructions là-bas, et ça a marché. Heureusement, cela aidera aussi quelqu'un d'autre :)