2012-04-03 326 views
2

在我在我的控制器的操作方法如下代碼:Controller.User是空單元測試

if (User.Identity.IsAuthenticated) 
{ 
    // ... 
} 

這似乎很好地工作。但是當我運行一個調用此操作的單元測試時,它會失敗,因爲User爲空?

任何人都可以提出處理這個問題的最佳方法嗎?我是否必須爲單元測試重構此代碼?

回答

3

您可能需要將用戶屬性設置爲設置的一部分。你可以通過ControllerContext來嘲笑HttpContextBase來創建控制器,以便返回你的模擬用戶。將你的模擬ControllerContext設置爲ControllerContext屬性,如果你已經正確配置了對象圖,它會找到User

2

Controller類的User屬性是從當前HttpContext複製的 - 你必須提供一個框架,並且設置適當的User有這個在您的單元測試工作。

2

如果您運行網絡請求上下文的以外的代碼,用戶將爲空。這聽起來像你正在直接對你的方法進行測試。

您有兩種選擇。

對於您的問題(但不一定是最可持續的修復),最快的修復方法是簡單地將您的運行網站作爲WebRequest從單元測試中調用。

更可持續的修復方法是將您對環境相關服務器端功能(如User)的使用收集到一個您可以模擬/僞造的類中。

編輯

任何人都可以提出來對付它的最好方法?我是否必須爲單元測試重構此代碼?

底線答案是「是」。更重要的是,你可能想要,因爲它會讓你的系統長期更靈活和/或可維護。