2016-12-08 92 views
0

我正在使用XUnit來處理WebAPI2 Web服務上的測試用例。 我有一個調用get使用App_Data來自測試單元的路徑?

AppDomain.CurrentDomain.GetData("DataDirectory").ToString(); 

當應用程序發佈和運行正常,但是,當我運行我的測試中,它不會路徑返回App_Data這將返回正確路徑App_Data目錄目錄。

我得到這個異常:Object reference not set to an instance of an object.

任何想法如何,我可以做到這一點?我試圖在我的測試項目中添加一個App_Data目錄,但它導致了相同的異常。

本質上,這是我存儲我需要訪問的加密實用程序的XML配置文件的位置。我應該把它移動到根?如果我這樣做,我將如何從我的測試單元訪問它?

+1

聽起來更像是一個集成測試而不是單元測試......單元測試應該不需要App_Data中的任何東西,應該這樣嗎?有了這個說法,我不知道如何獲得測試項目來映射,但如果我正在進行集成測試,我可能會直接提供配置中的信息到測試應用程序(例如,硬編碼/模擬),而不是試圖讀取實際的配置。 – jleach

+0

@ jdl134679,我繼續,並將其作爲配置設置在我的app.config和Web.config中。作爲答案獲得積分。 – MB34

+0

完成,謝謝... – jleach

回答

-2

如果你的配置複製到測試項目(作爲app.config),然後使用System.Configuration.ConfigurationManager.AppSettings["SettingName"],它會從app.config中使用MVC項目運行時,使用的測試項目和web.config運行時拉。

+0

這不是做這件事的方法。單元測試不應該有配置文件 –

+0

@AndreiDragotoniu - 我並不反對(你的一個upvotes是來自我),我在我最初對OP的評論中提到了很多。這就是說,僅僅因爲他使用XUnit並不意味着他不是在編寫集成測試而不是單元測試(集成測試就是我需要對這種配置進行分類的東西)。 – jleach

+0

順便說一句,測試需要一個存儲在App_Data目錄中的模板。在測試單元中可以使用該目錄。 – MB34

2

爲此,我建議你抽象配置數據檢索。

寫的接口與一個或多個方法,如果你需要更多的,是這樣的:

public interface IConfigurationData 
{ 
    string RetrieveConfigurationData() 
} 

的是,執行會去App_Data文件夾在磁盤上。 在你的單元測試中,你嘲笑那個接口並且讓它檢索你的測試需要的任何配置。

單元測試不應該觸及任何外部系統,如文件或數據庫或第三方API。你可以將它們抽象出來,並用RhinoMocks或Moq或NSubstitute之類的東西嘲笑它們,無論你喜歡什麼。

原因是您希望單元測試儘可能快地運行。當你引入一個實際的系統時,就像一個文件一樣,它們不再那麼快了,當你添加更多的單元測試時,執行時間會不斷增加。理想情況下,您希望單元測試能夠在幾秒鐘內運行,因此您可以隨意多次運行它們,而不會延遲開發過程。

+0

+1,但是我認爲比你提到的速度問題更重要的原因是單元測試應該針對非常小的邏輯,這些邏輯更微妙,但也使它們更具彈性並最終在longrun中有更多的用途(例如,它們應該只有很少的零外部依賴性,無論是從磁盤還是其他地方)。 – jleach

+0

順便說一下,該測試需要存儲在App_Data目錄中的模板。在測試單元中可以使用該目錄。 – MB34