2013-01-11 8 views
7

Wir schreiben Komponententests für unsere Business-Schicht unter .NET 4.0. Die Business-Schicht ist eine einfache C# -Klassenbibliothek, die normalerweise in SOAP- und REST-Webdiensten ausgeführt wird. Unsere Anwendung verwendet log4net in einer separaten Wrapper-Assembly für die Protokollierung. Der C# -Code in der Logging-Assembly hat eine Assembly-Info-Direktive, die log4net den Namen der Konfigurationsdatei mitteilt: aaLog4net kann die Konfigurationsdatei nicht finden, wenn sie von Visual Studio/Microsoft Test Framework ausgeführt wird

[assembly: log4net.Config.XmlConfigurator (ConfigFile = "AcmeLogging.config", Watch = true) ]

Die Initialisierung von log4net über den Wrapper funktioniert in den Webdiensten einwandfrei. Wenn wir es mit unserer Komponententest-Assembly initialisieren, scheint es die Konfigurationsdatei nicht zu sehen. Die Konfigurationsdatei wird über Eigenschaften konfiguriert, die in das Ausführungsverzeichnis kopiert werden sollen, und wir sehen sie im Verzeichnis bin \ debug. Ein schnelles Konsolentestprogramm, das die Protokollierungsbaugruppe verwendet, die in demselben Ordner ausgeführt wird, funktioniert einwandfrei. Das Merkwürdige ist, dass die Verhaltensprobleme periodisch auftreten und auf verschiedenen Maschinen der Entwickler zu verschiedenen Zeiten auftauchen und nicht in irgendeiner deterministischen Weise geheilt werden können.

Beim Durchlaufen des Wrapper Assembly-Codes wird der log4netLogManager.GetLogger() - Aufruf korrekt zurückgegeben, aber die Liste der von log.Logger.Repository.GetAppenders() zurückgegebenen Appender ist leer. Da dieses inkorrekte Verhalten unabhängig davon ist, ob sich die Datei im Ordner Bin \ Debug befindet oder nicht, glauben wir, dass die Datei nicht angezeigt wird.

Alle Hinweise darauf, was wir über das Ausführen von log4net im Microsoft Test Framework vermissen, wären sehr willkommen.

Antwort

8

Komponententests sind einzigartig in der Tatsache, dass Sie, wenn Sie Konfigurationsdateien in Ihren Komponententests benötigen, diese als Bereitstellungselemente hinzufügen müssen. Hier ist ein Beispiel dafür, wie ich dies in meiner Testklasse:

[TestClass] 
[DeploymentItem("hibernate.cfg.xml")] 
public class AsyncForwardingAppenderTest 
{ 

} 

Neben dem Deployment Attribut müssen Sie Deployment aktivieren in Ihre Testeinstellungen. Gehen Sie dazu zu Test-> Testeinstellungen bearbeiten->. Dann klicken Sie auf Deployment Bereich auf der rechten Seite. Klicken Sie auf das Kontrollkästchen Enable Deployment.

Nachdem Sie dies getan und Ihren Test ausgeführt haben, sollte sich Ihre Konfigurationsdatei in Ihrem Testergebnisordner befinden. TestResults \ username_machine date stamp \ Out. Wenn sich Ihre Konfigurationsdatei nicht in diesem Ordner befindet, funktioniert sie nicht. Dies ist das Attribut DeploymentItem. Es klebt die Datei in diesem Ordner Out.

Wenn Sie das DeploymentItem-Attribut nicht in jede Testklasse aufnehmen möchten, musste ich eine Basis-Testklasse erstellen, die alle Tests, die log4net verwenden, erbt und mit dem DeploymentItem-Attribut kennzeichnet.

+0

Dies war _exactly_ was wir brauchten, dies wird das ganze Team sehr glücklich machen. Vielen Dank. Ich würde gerne für diese Antwort stimmen, aber nicht genug SO-Aktivitäten, um dies zu tun - aber zukünftige Leser sollten dies als zusätzliche Stimme für diese Antwort betrachten. –

Verwandte Themen