2008-12-02 7 views
2

Je pensais que ce serait bien de créer une classe de base pour les appareils de test NUnit qui ouvre un TransactionScope pendant la phase SetUp, puis annule la transaction lors de la suppression. Quelque chose comme ceci:Est-ce sécuritaire? - La classe de base NUnit ouvre et annule un TransactionScope

public abstract class TestFixtureBase 
{ 
    private TransactionScope _transaction; 

    [TestFixtureSetUp] 
    public void TestFixtureSetup() 
    { 
     _transaction = new TransactionScope(); 
    } 

    [TestFixtureTearDown] 
    public void TestFixtureTearDown() 
    { 
     if (_transaction != null) 
     { 
      _transaction.Dispose(); 
     } 
    } 
} 

Pensez-vous que cela est une bonne idée? De toute évidence, la base de données est simplement une base de données de test, pas une base de données en ligne, mais elle serait encore ennuyeuse si elle contenait des données inutiles provenant des tests unitaires.

Que font les autres utilisateurs lorsqu'ils exécutent des tests unitaires impliquant beaucoup d'accès aux données?

Répondre

1

Je l'ai utilisé XtUnit Il roule automatiquement à la fin d'un test unitaire. Vous pouvez simplement ajouter un attribut [Rollback] au test. C'est une extension à NUnit ou MbUnit

4

Vous voulez faire attention ici. TransactionScope va promouvoir la transaction vers une transaction distribuée si vous ouvrez plus d'une connexion à la base de données. Je trouve qu'il est plus facile d'écrire un simple SQL qui efface les tables d'intérêt pour ma classe de test avant de commencer le test.

EDIT: Normalement j'appellerais n'importe quel test qui touche la base de données un test d'intégration puisqu'il implique un autre système. Typiquement, je vais simuler la base de données lors de la mise à l'essai de mon code.

[TestSetup] 
public void Setup() 
{ 
    foreach (string table in new string[] { "table1", "table2" }) 
    { 
     ClearTable(table); 
    } 
} 

private void ClearTable(string table) 
{ 
    ...standard stuff to set up connection... 
    SqlCommand command = connection.CreateCommand()); 
    command.CommandText = "delete from " + table; 
    command.ExecuteNonQuery(); 
    ... stuff to clean up connection... 
} 
+1

+ 1 pour simuler l'accès aux données ... sauf si vous testez réellement l'implémentation DAL. – Gishu

Questions connexes