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並創建兩個測試,其中第二個測試如果視圖爲空則測試未找到的異常。
什麼是測試此功能的正確方法?任何指針,示例代碼或博客文章都會有所幫助。
感謝
達林,謝謝!你能澄清「locations1」,「locations2」嗎?假設我的視圖位於〜Views/Content/ContactUs.aspx,我希望上面的測試能夠找到它。我如何設置ViewEngineResult? – Thomas 2010-08-01 08:31:49
無論你的觀點在哪裏。在單元測試項目中沒有看法。這是嘲笑視圖引擎的關鍵。 'location1'和'location2'只是爲了讓編譯器感到高興。根本不用。你可以在那裏放一個空字符串集合。但在現實世界中,它們代表了您的視圖引擎嘗試搜索視圖的位置。 – 2010-08-01 08:34:48
因此,在您的示例result.View爲空,所以當測試運行視圖將不會被發現。我將如何去測試反向?我想測試是否發現視圖。 – Thomas 2010-08-01 08:48:56