2011-05-19 66 views
3

我正在編寫單元測試以測試MVC 3控制器。我想確保從控制器返回的視圖是正確的視圖。在我的單元測試我有:MVC 3 - 單元測試控制器結果

[Test] 
      public void It_Should_Return_The_Right_Page() 
      { 
       FormController fc = this.CreateFormController(); 
       var view = fc.FindX(); 
       Assert.AreEqual("FindX", view.ViewName); 
      } 

在我的控制,我有:

public ViewResult FindX() 
     { 
      return View(); 
     } 

失敗的原因VIEWNAME爲空。如果我將呼叫更改爲return View("FindX"),並顯式定義要返回的視圖,則該視圖起作用。但是,如果可能的話,我想避免這種情況。有沒有一種普遍接受的方法來解決這個問題?

+2

可能重複http://stackoverflow.com/questions/2912463/viewresult-viewname-property-empty-in-單元測試) – 2011-05-19 13:06:20

回答

2

如果您未設置視圖名稱,那麼ViewName不是正確的和預期的結果,因此請相應地編寫您的測試。

Assert.IsNull(view.ViewName); 
+0

@Xhalent - 這將是,但我想做一個測試,說「返回的行動是正確的」,所以我需要綁定到具體的行動。看起來像ViewBag.Title是一個合理的選擇,因爲它會爲頁面提供正確的標題。 – skaz 2011-05-19 13:22:22

+0

然後在控制器中設置視圖名稱。你不必留下空白。這就是我所做的事情,即使視圖與動作名稱相匹配。 – Xhalent 2011-05-19 13:28:44

+0

@Xhalent - 抱歉 - 我想我沒有解釋得很好。我知道我可以在控制器中設置名稱,但是在那裏有一個明確的字符串文字會感到有點奇怪,因爲沒有參數的默認值將會轉到正確的View。我想知道是否有更好的方法。 – skaz 2011-05-19 13:58:50

4

這聽起來像你想傳達的是什麼:斷言,返回此方法的默認視圖。一種傳達此方法的方法是使用以下線路:

var view = fc.FindX(); 

Assert.IsNull(view.ViewName) 

但是,這並不能很好地表達您的意圖。更清楚地傳達出來的一種方法是創建的ActionResult或的ViewResult稱爲AssertIsDefaultView擴展方法,像這樣:

public static class ActionResultAssertions 
{ 
    public static void AssertIsDefaultView(this ActionResult actionResult) 
    { 
     var viewResult = actionResult as ViewResult; 

     Assert.IsNotNull(viewResult); 
     Assert.IsNull(viewResult.ViewName); 
    } 
} 

然後在您的測試,你可以說:

var view = fc.FindX(); 
view.AssertIsDefaultView(); 

MvcContrib有一套這些斷言(我認爲方法的名稱是AssertViewRendered),但我更願意自己編寫擴展,以便更好地理解MVC。

+0

行'Assert.IsNull(viewResult.ViewName);'應讀取'Assert.IsTrue(string.IsEmpty(viewResult.ViewName))'。在我的情況下,這個屬性不會爲空,而是空的。除此之外,我喜歡這種迴應,因爲它展示瞭如何更好地表達測試意圖的方式。 – Manfred 2012-01-20 22:20:54

+0

甚至Assert.IsNullOrEmpty(viewResult.ViewName); – Duncan 2012-09-17 13:44:24

0

爲我工作

public ViewResult FindX() 
    { 
     return View("FindX"); 
    } 
[ViewResult.ViewName財產空的單元測試(的