2013-01-11 24 views
7

我們正在爲在.NET 4.0下運行的業務層編寫單元測試。業務層是一個簡單的C#類庫,通常在SOAP和REST Web服務中運行。我們的應用程序在獨立的包裝程序集中使用log4net進行日誌記錄。日誌程序集中的C#代碼有一個程序集信息指令,它告訴log4net配置文件的名稱,一個lar當從Visual Studio/Microsoft Test Framework運行時,Log4net找不到配置文件

[程序集:log4net.Config.XmlConfigurator(ConfigFile =「AcmeLogging.config」,Watch = true) ]

通過包裝器初始化log4net可以在Web服務中正常工作。當我們用我們的單元測試程序集初始化它時,它看起來沒有看到配置文件。 configuratino文件是通過將屬性複製到執行目錄來配置的,我們可以在bin \ debug目錄中看到它。使用從同一文件夾內運行的日誌程序集的快速控制檯測試程序可以正常工作。奇怪的是,行爲問題是間歇性的,並且在不同的時間在不同的開發者機器上彈出,並且不能以任何確定性的方式被治癒。

單步執行包裝程序集代碼時,log4netLogManager.GetLogger()調用顯示爲正確返回,但log.Logger.Repository.GetAppenders()返回的appender列表爲空。由於這種不正確的行爲是相同的,無論文件是否在Bin \ Debug文件夾中,我們都認爲它沒有看到該文件。

任何有關我們在Microsoft Test Framework中運行log4net時缺少的線索都將不勝感激。

回答

8

單元測試是獨一無二的,因爲如果您在單元測試中需要配置文件,則需要將它們包含爲部署項目。下面是我怎麼做我的測試類中的一個例子:

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

} 

除了Deployment屬性,你需要在您的測試設置中啓用部署。要做到這一點去測試 - >編輯測試設置 - >。然後點擊右側的Deployment區域。點擊複選框Enable Deployment

完成此操作並運行測試後,您的配置文件應位於您的測試結果文件夾中。 TestResults \ username_machine日期戳\ Out。如果你的配置文件不在這個文件夾中,它將不起作用。這是DeploymentItem屬性的作用。它粘在Out文件夾中的文件。

如果您不想在每個測試類中包含DeploymentItem屬性,我所做的就是創建一個基本測試類,以便使用log4net的所有測試都繼承並使用DeploymentItem屬性標記它。

+0

這完全是我們所需要的,這會讓整個團隊都非常開心。非常感謝你。我想爲這個答案投票,但沒有足夠的SO活動來這樣做 - 但未來的讀者應該考慮這個答案的額外投票。 –

相關問題