2011-03-31 1 views
6

Essayer d'effectuer des tests unitaires avec le code EF 4.1 en premier. J'ai mon live db (SQL Server) et mon DB unité de test (Sql CE). Après avoir combattu (et perdre) avec EF, Sql CE 4.0 et de transactions j'ai décidé le moyen le plus simple d'exécuter mon test était de:Entity Framework 4.1 «Code First» SetInitializer ne pas être appelé à nouveau après Database.Delete

  1. Créer Db
  2. Test de
  3. Supprimer Db
  4. Rincer et répéter

J'ai mon [Setup] et fonctions [teardown]:

[SetUp] 
public void Init() 
{ 
    System.Data.Entity.Database.SetInitializer(new MyTestContextInitializer()); 
    _dbContext = ContainerFactory.Container.GetInstance<IContext>(); 
    _testConnection = _dbContext.ConnectionString; 
} 

[TearDown] 
public void Cleanup() 
{ 
    _dbContext.Dispose(); 
    System.Data.Entity.Database.Delete(_testConnection); 
} 

Le problème est que System.Data.Entity.Database.SetInitializer n'appelle pas MyTestContextInitializer après le premier test.

D'où le 2ème test échoue ensuite avec:

System.Data.EntityException: Le fournisseur sous-jacent a échoué sur Ouvrir.
----> System.Data.SqlServerCe.SqlCeException : Le fichier de base de données est introuvable. Vérifiez le chemin de la base de données

TIA pour tous les pointeurs

Répondre

7

J'ai eu autour de ce en appelant « InitializeDatabase » manuellement. Comme si:

[SetUp] 
    public void Init() 
    { 

     var initializer = new MyTestContextInitializer(); 
     System.Data.Entity.Database.SetInitializer(initializer); 

     _dbContext = ContainerFactory.Container.GetInstance<IContext>(); 
     initializer.InitializeDatabase((MyTestContext)_dbContext); 

     _testConnection = _dbContext.ConnectionString; 
    } 

    [TearDown] 
    public void Cleanup() 
    { 
     System.Data.Entity.Database.Delete(_testConnection); 

     _dbContext.Dispose(); 
    } 

Je pense qu'il peut être un bug avec EF 4.1 RC.

+0

Belle, cela m'a aidé à trier ce que je pensais était le verrouillage du fichier DB (CE 4) entre les appareils de test. +1 :) –

+0

Brillant! J'ai eu exactement ce problème, avec EF5 pas moins, et a été coincé sur un moment. Ceci l'a arrangé pour moi, merci. –

2

Ce n'est pas un bug, l'initialiseur mis à

System.Data.Entity.Database.SetInitializer 

n'est appelée lorsque le contexte est créé pour la première fois dans le AppDomain. Par conséquent, puisque vous exécutez tous vos tests dans un seul AppDomain, il n'est appelé que lorsque le premier test est exécuté.

1

Il m'a fallu près d'une journée pour découvrir ce qui a provoqué mon comportement unittest étrange: la connexion à la base de données est restée ouverte ou la base de données n'a pas été créée avec chaque nouveau test. J'ai cherché partout la racine de la cause: MSTest (pas de droits d'administrateur ou où des copies de travail de fichiers ont été supprimées?), SQL Server Express/CE (échec de connexion?), Unity (objets non disposés?) Ou Entity Framework initialisation de base de données?). Il s'est avéré être EF. Merci beaucoup pour la réponse!

Questions connexes