2017-09-28 6 views
1

J'ai une classe de base pour mes tests unitaires qui établit une transaction simple autour de chaque test.TransactionAbortedException dans TestInitialize

public class TestBase 
{ 
    TransactionScope _trans; 

    [TestInitialize()] 
    public void Init() 
    { 
     _trans = new TransactionScope(); 
    } 

    [TestCleanup()] 
    public void Cleanup() 
    { 
     _trans.Dispose(); 
    } 
} 

Dans une de mes classes inheriting J'ai un tas de travail que je veux faire une fois, avant que l'un de ces tests sont effectués - cela devrait revenir après tous les tests de la classe sont terminés.

[TestClass] 
public class MyTests : TestBase 
{ 
    static TransactionScope _transClass; 
    [ClassInitialize()] 
    public static void ClassInit(TestContext context) 
    { 
     _transClass = new TransactionScope(); 
     //do some setup 
    } 

    [ClassCleanup()] 
    public static void ClassCleanup() 
    { 
     _transClass.Dispose(); 
    } 

    [TestMethod()] 
    public void TestMethod() 
    { 
     //do some testing 
    } 
} 

Ma classe actuelle a bien sûr plusieurs méthodes de test. La première méthode de test passe bien, mais la seconde lève une exception TransactionAbortedException lorsqu'elle tente de configurer un nouveau TransactioScope dans TestInitialize. Quelqu'un pourrait-il expliquer ce que j'ai mis en place ici?

Répondre

0

Je soupçonne que la classe de base TestBase peut faire quelque chose avec la connexion après chaque test.

Il est préférable d'utiliser des transactions avec l'instruction using - cela élimine des problèmes comme le vôtre.

Avoir plusieurs tests en une seule transaction n'est pas une bonne idée, cela signifie que les tests sont interdépendants. Cela conduit à difficile de suivre les problèmes lorsqu'un test réussit ou échoue selon qu'il est exécuté dans un groupe ou seul.

En résumé, je déconseille d'avoir un champ membre pour la transaction et utilise à la place des variables locales avec l'instruction using.