2013-07-26 71 views
0

我有以下控制器:在控制器單元測試中包含ModelState.IsValid?

public ActionResult Login(LoginUseraccount loginUseraccount) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      //Do something 
      return RedirectToAction("Index", "Dashboard"); 
     } 
     else 
     { 
      //Do something 
      return RedirectHomeIndex; 
     } 
    } 
    catch (UserNotActiveException userNotActiveException) 
    { 
     //Do something 
     return RedirectHomeIndex; 
    } 
    catch (Exception exception) 
    { 
     //Do something 
     return RedirectHomeIndex; 
    } 
} 

我有三個問題:

1)你定義了兩個測試爲的if-else? 第一個測試會測試ModelState.IsValid == true,另一個測試ModelState.IsValid == false?在針對該模型編寫的單元測試中測試它是否更有意義?

2)你會測試UserNotActiveException?如果拋出異常由業務邏輯(其他類)決定。所以在業務邏輯測試中做這個測試會更有意義,你同意嗎?

3)你會測試例外嗎?我認爲這沒有道理。

我知道沒有「正確」或「錯誤」,但我真的很感謝您的反饋。

+0

1是的,雖然else是多餘的,因爲如果返回。 2)是,3,是 – Slicksim

回答

1

在我看來,你應該測試一切。 它不會花費太多的精力和時間,但對您的代碼有很高的信心。

  1. 我想你絕對應該這樣做。
  2. 您應該測試的不是異常的原因,而是異常情況下控制器的行爲。所以你的測試應該驗證在UserNotActiveException的情況下控制器返回適當的ActionResult
  3. 與第二點相同。
+0

謝謝!關於第2點:我不知道如何重現拋出異常。所以我將無法測試這部分代碼。或者是否有可能強制該方法拋出異常? – mosquito87

+0

這取決於'//做些什麼':)裏面發生了什麼,以及誰拋出了這個異常。 例如,假設您有一些帶有'Login'方法的'IBusinessLogicService'接口(並且此方法引發此異常),並且您正在控制器內使用此服務來執行必要的邏輯,則可以模擬此接口,以便爲特定單元測試它總是會拋出所需類型的異常。 –

+0

「異常」不會在我們的代碼中引發。這只是爲了確保在控制器中找到每個異常。但我無法重現拋出的異常。 :( – mosquito87

0

我肯定會寫入單元測試的if/else子句。你想確保所有的邏輯都在你的測試中被覆蓋,但是它應該單獨完成,而不是在同一個測試中。

至於例外,我會再次測試這些。您可以使用MvcContrib來幫助單元測試您的操作方法,以檢查返回哪些路線或視圖等。 RedirectToHomeIndex。我會這樣做,因爲我相信行動方法可以做到我期望的那樣。如果有任何測試失敗,那麼我知道用戶可能會被重定向到不同於我想要的頁面。