2010-07-30 175 views
3

我最近做了一些我的mvc應用程序的重構,並意識到有很多靜態視圖返回。我決定創建一個控制器,它返回靜態視圖(如果它們存在的話),並在視圖不存在時拋出404錯誤,而不是使用具有僅返回視圖的動作結果的多個控制器。單元測試ViewEngines.Engines.FindView的正確方法是什麼?

public ActionResult Index(string name) 
{ 
    ViewEngineResult result = ViewEngines.Engines.FindView(ControllerContext, name, null); 

    if (result.View == null) 
     ThrowNotFound("Page does not exists."); 

    return View(name); 
} 

我的問題是什麼是單元測試的正確方法呢?我嘗試了下面的代碼,但是我得到的錯誤是「RouteData必須包含一個名爲'controller'的項目,其中包含一個非空字符串值」。

[Theory] 
[InlineData("ContactUs")] 
public void Index_should_return_view_if_view_exists(string name) 
{ 
    controller = new ContentController(); 
    httpContext = controller.MockHttpContext("/", "~/Content/Index", "GET"); ; 

    var result = (ViewResult)controller.Index(name); 

    Assert.NotNull(result.View); 
} 

我的意圖是讓單元測試外出並獲取真實的視圖。然後我開始想知道是否應該用ViewGate的SetupGet模擬ViewEngines並創建兩個測試,其中第二個測試如果視圖爲空則測試未找到的異常。

什麼是測試此功能的正確方法?任何指針,示例代碼或博客文章都會有所幫助。

感謝

回答

4

您應該創建一個嘲笑視圖引擎,並把它收集在:

[Theory] 
[InlineData("ContactUs")] 
public void Index_should_return_view_if_view_exists(string name) 
{ 
    var mockViewEngine = MockRepository.GenerateStub<IViewEngine>(); 
    // Depending on what result you expect you could set the searched locations 
    // and the view if you want it to be found 
    var result = new ViewEngineResult(new [] { "location1", "location2" }); 
    // Stub the FindView method 
    mockViewEngine 
     .Stub(x => x.FindView(null, null, null, false)) 
     .IgnoreArguments() 
     .Return(result); 
    // Use the mocked view engine instead of WebForms 
    ViewEngines.Engines.Clear(); 
    ViewEngines.Engines.Add(mockViewEngine); 

    controller = new ContentController(); 

    var actual = (ViewResult)controller.Index(name); 

    Assert.NotNull(actual.View); 
} 
+0

達林,謝謝!你能澄清「locations1」,「locations2」嗎?假設我的視圖位於〜Views/Content/ContactUs.aspx,我希望上面的測試能夠找到它。我如何設置ViewEngineResult? – Thomas 2010-08-01 08:31:49

+0

無論你的觀點在哪裏。在單元測試項目中沒有看法。這是嘲笑視圖引擎的關鍵。 'location1'和'location2'只是爲了讓編譯器感到高興。根本不用。你可以在那裏放一個空字符串集合。但在現實世界中,它們代表了您的視圖引擎嘗試搜索視圖的位置。 – 2010-08-01 08:34:48

+0

因此,在您的示例result.View爲空,所以當測試運行視圖將不會被發現。我將如何去測試反向?我想測試是否發現視圖。 – Thomas 2010-08-01 08:48:56

相關問題