2010-03-08 8 views
11

Ich habe an einem Testframework gearbeitet, das eine neue App-Domäne erstellt, in der die Tests ausgeführt werden. Der Hauptgrund dafür, dass die DLLs getestet werden, hat schrecklichen Code, der darauf beruht, dass sich die DLL im Pfad der App befindet. (Nein, ich kann diesen Code nicht ändern.)Wie bekomme ich stdout in Mstest Ausgabe, wenn ich in einer neuen App-Domain laufe?

Das Problem, das ich habe, ist, dass mein Testteam eine Reihe von Funktionstests in mstest schreibt und einer der Logger, der in Console.Out schreibt, nicht eine der Protokollinformationen in der trx-Ausgabe erfasst haben. Wenn der Code über eine Konsolenanwendung ausgeführt wird, werden alle Protokollinformationen ordnungsgemäß ausgegeben. Auch die anderen Logger, die implementiert wurden.

Mein Gedanke ist, dass mstest seinen eigenen TextWriter auf Console.Out setzt, aber die neue App doamin hat einen eigenen TextWriter für Console.Out, da die neue App-Domain einen eigenen Satz von Statiken hat.

Ich schätze Ihre Ideen.

+0

Hinweis: Diese Frage und die angenommene Antwort gelten auch für das NUnit-Fenster "Textausgabe" und Tests, die neue App-Domänen erstellen (und in stdout schreiben). –

Antwort

10

Ich fühle mich ein wenig verlegen, aber sobald ich schicke und wieder darüber nachdachte, wurde das Problem irgendwie offensichtlich und ich arbeitete eine Lösung aus.

Das Problem ist, dass die ursprüngliche Console.Out von Mstest auf einen neuen TextWriter gesetzt wurde und dies nicht in meiner neuen App-Domäne festgelegt wurde.

Also habe ich eine SetConsoleOut-Methode für die Klasse erstellt, die ich in der neuen App-Domäne erstellt habe, und ich übergebe es Console.Out.

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

testFramework.SetConsoleOut(Console.Out); 

Und in Testframework habe ich die Methode

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

Arbeiten wie ein Charme. Ich bin mir nicht sicher über die Etikette hier. Soll ich nur die Frage löschen oder meine Antwort zu der Frage hinzufügen?