2010-03-08 19 views
11

J'ai travaillé sur un framework de test, qui crée un nouveau domaine d'application pour exécuter les tests. La raison principale étant la DLL que nous testons possède un code horrible qui repose sur la DLL se trouvant dans le chemin du domaine app. (Non je ne peux pas changer ce code.)Comment obtenir stdout dans la sortie mstest lors de l'exécution dans un nouveau domaine d'application?

Le problème que j'ai est que mon équipe de test écrit un tas de tests fonctionnels dans mstest et l'un des enregistreurs, qui écrit sur Console.Out, ne avoir l'une des informations de journal capturés dans la sortie trx. Lorsque vous exécutez le code via une application de console, toutes les informations de journal sont affichées correctement. Alors faites les autres enregistreurs qui ont été implémentés. Je pense que mstest définit son propre TextWriter sur Console.Out, mais la nouvelle application doamin possède son propre TextWriter pour Console.Out, car le nouveau domaine d'application possède son propre ensemble de statistiques.

J'apprécie vos idées.

+0

Remarque: cette question et la réponse acceptée s'appliquent également à la fenêtre «Sortie de texte» de NUnit et aux tests qui créent de nouveaux domaines d'application (et écrivent sur stdout). –

Répondre

10

Je me sens un peu penaud, mais une fois que j'ai frappé et que j'ai réfléchi à nouveau, le problème est devenu évident et j'ai trouvé une solution.

Le problème est que Console.Out d'origine était défini sur un nouveau TextWriter par mstest et que cela n'était pas défini dans mon nouveau domaine d'application.

J'ai donc créé une méthode SetConsoleOut sur la classe que j'ai créée dans le nouveau domaineApp et je lui passe Console.Out.

TestFramework testFramework = 
      (TestFramework)newAppDomain.CreateInstanceAndUnwrap(
               "TestFrameworkLibrary", 
               "MyNamespace.TestFramework"); 

testFramework.SetConsoleOut(Console.Out); 

Et je TestFrameWork ajouté la méthode

internal void SetConsoleOut(TextWriter consoleOut) 
{ 
    Console.SetOut(consoleOut); 
} 

fonctionne comme un charme. Je ne suis pas sûr de l'étiquette ici. Devrais-je simplement supprimer la question ou ajouter ma réponse à la question?