J'aimerais exécuter des tests de procédures stockées dans ma base de données sans affecter les données (ou pour le mettre plus précisément, sans un impact durable après la course au test).
Après quelques recherches que je suis venue Avec l'approche de l'utilisation de transactionsCope dans mon projet de test Visual Studio 2010 tel que P>
public TransactionScope Scope { get; set; } [ClassInitialize] public static void ClassInitialize( TestContext testContext ) { Scope = new TransactionScope(); // Do some db set up stuff, e.g. create records used for tests etc. } [ClassCleanup] public static void ClassCleanup() { Scope.Dispose(); } [TestMethod] public void MyTestMethod() { using( SqlConnection connection = new SqlConnection( "someConnectionString" ) ) { DataTable result = new DataTable(); using( SqlCommand command = new SqlCommand( "spName", connection ) ) { command.CommandType = CommandType.StoredProcedure; using( SqlDataAdapter adapter = new SqlDataAdapter() ) { adapter.SelecteCommand = command; // The next line causes the exception to be thrown adapter.Fill( result ); } } // Assertions against DataTable result } }
3 Réponses :
Vous pouvez créer votre configuration quelque chose comme ceci: comme pour l'erreur que vous obtenez, pourriez-vous publier exactement comment vous utilisez votre implémentation? p> p>
Une approche que j'ai utilisée avec succès crée une classe de base qui implémente la configuration et la dérappement. Dans la méthode de configuration, vous créez une nouvelle portée de transaction et stockez-la dans une variable de classe privée. Dans la méthode de la déchirure, vous retournez la portée de la transaction. P>
J'utilise Nunit, mais le principe devrait être le même pour le MSSest. L'indice ici est que En outre, comme @blech mentionne, le service Microsoft Distributed Transaction Coordinator (MSDTC) doit être exécuté pour cette solution pour fonctionner. P> configuration code> et
TeReLowdown code> est exécuté une fois avant et après chaque strong> test de l'unité pour assurer l'isolation des tests d'unité. P>
Merci pour votre réponse rapide. Mais cette approche ne se retrouve-t-elle pas avec le même problème lors du démarrage de la méthode de transaction dans une méthode (configurée), appelant une autre méthode (test) puis la disposant dans le nettoyage (démolition)? Les équivalents de Nunit existent comme classinitialize (TestFixTureUp) et testinitialize (Configuration) ainsi que leurs homologues de déchirure correspondants (ClassCleanup, TestCleanup).
@Gorgsenegger - probablement. Avez-vous été testé à l'aide de testinitialize code> et
testcleanup code>?
@Peter Lillevold Je n'ai pas compris la différence d'utilisation d'une transaction dans une classe de base vs à l'aide directement dans la classe de test en cours. Parlez-vous de la réutilisation de code ou autre chose?
@satyajit - c'est pour la réutilisation de code, qui a également un effet secondaire agréable que les tests d'unités seront plus propres.
Votre exception dit que MSDTC n'est pas activé. Je suppose que lorsque vous utilisiez des transactions de transaction individuellement, il s'agissait simplement de créer des transactions SQL locales - qui ne nécessitent pas de DTC. Toutefois, lorsque vous partagez un transaction sur plusieurs connexions, la transaction est "promue" à une transaction distribuée via le DTC, que vous n'avez peut-être pas activée. P>
Essayez d'activer l'accès réseau sur MSDTC sur votre machine locale et sur le serveur. Les étapes pour faire varier un peu en fonction de votre système d'exploitation. Voici comment le faire dans Win 2003 Server . Voici un lien pour Win 2008 . Notez que vous aurez probablement besoin d'activer DTC via vos pare-feu également (expliqué dans le dernier lien ...) p>
Merci, cela m'a pointé dans la bonne direction - dès que j'ouvris plus d'une connexion, j'ai eu l'exception, j'ai donc créé une propriété de connexion publique que je pourrais réutiliser de mes différentes méthodes. Ce que j'ai découvert aussi lorsque j'ai changé mon code, vous devez éviter une exception invalideOvereException dans la méthode de nettoyage, je devais déplacer les appels pour créer et éliminer les transactions sur les méthodes marquées par [Testinitialize] et [TestCleanup] plutôt que leurs équivalents de classe. .
Pouvez-vous fournir plus de détails à partir de l'exception?