2011-08-04 63 views
0

我想測試一些控制器操作的視圖包含Html.Action與PartialViews。但是在調試它們時,我沒有得到我想通過視圖調用的操作中的斷點。
這裏是我的控制器代碼:單元測試Html.Action和PartialView

public class SomeController 
{ 
    public ActionResult MyAction() 
    { 
     return View(); 
    } 

    public PartialViewResult SubAction() 
    { 
     return PartialView(); 
    } 
} 

在MyAction查看代碼很簡單:

@{ 
    ViewBag.Title = "MyAction"; 
} 
@Html.Action("SubAction") 

與我TestMethod的,我想檢查是否返回正確的視圖名:

[TestMethod] 
public void MyActionTest() 
{ 
    SomeController controller = new SomeController(); 
    ViewResult result = controller.MyAction() as ViewResult; 
    Assert.IsNotNull(result, "The result is not a view result."); 
    Assert.AreEqual("some expected name", result.ViewName); 
} 

另一個問題是result.ViewName在這裏是空的,我不知道這是爲什麼。所以這是另一個沒有答案的問題。這個問題是爲什麼我試圖調試我的單元測試,並認識到我不能分解成SubAction()。

對此有何建議?

乾杯,
西蒙

回答

2

當您運行單元測試,認爲不會被渲染。 @Html.Action("SubAction")僅在渲染視圖時執行。當你說:「我想測試一些控制器動作的視圖包含Html.Action與PartialViews」,你實際上是說你想測試視圖和內部視圖的邏輯。

您未達到SubAction中斷的原因是因爲MyAction視圖根本沒有被渲染。測試這些場景的方法是:

  1. 在測試1中檢查MyAction是否返回ViewResult,其內部視圖模型的屬性中包含所有正確的值。
  2. 在單元測試2中檢查SubAction是否返回ViewResult,其內部視圖模型在其屬性中包含所有正確的值。
  3. ViewName是一個只有在您致電時才填充的屬性返回View("some other non-convetional view")然後result.ViewName將= "some other non-convetional view"您不會爲使用約定默認值的用戶測試視圖名稱,因爲您信任框架以正確連接它。
2
  1. ViewResult,更普遍,ActionResult是某種返回結果給客戶什麼時候要執行規範。換句話說,創建它的實例(從控制器返回View())確實會創建規範,但不會執行它。 MVC運行時捕獲從控制器返回的ActionResult和Execute()s它。你不能在視圖內部打破它,因爲它還沒有被執行 - 只是創建了規範。如果你想調用Execute()方法,就像mvc運行時一樣,你可以觸發視圖執行並打開調試器。
  2. 因爲沒有設置,所以無法看到視圖名稱。從msdn

ViewResult.ViewName獲取或設置渲染視圖的名稱。

如果您在返回查看時沒有設置它,則只在ViewResult爲Executed()時填充,請參閱上述說明。

當應用單元測試控制器時,您應該僅測試控制器及其與視圖,存儲庫等的迭代。測試控制器時,您不需要調試視圖。如果您需要測試SubAction,請爲其編寫單獨的測試。您可以使用MvcContrib.TestHelpers來更簡單地測試您的控制器。