2010-04-29 176 views
1

可以說我有一個簡單的ASP.NET MVC控制器我想測試。我想測試一個控制器動作(在這種情況下,Foo)只是返回到另一個動作(在這種情況下,酒吧)的鏈接。如何單元測試這個簡單的ASP.NET MVC控制器

你會如何測試TestController.Foo? (無論是第一個還是第二個鏈接)

我的實現具有相同的鏈接兩次。一個通過url拋出ViewData []。這對我來說似乎更具可測性,因爲我可以檢查從Foo()返回的ViewData集合。即使這樣,但我不知道如何驗證url本身,而不依賴路由。

控制器:

public class TestController : Controller 
{ 
    public ActionResult Foo() 
    { 
     ViewData["Link2"] = Url.Action("Bar"); 
     return View("Foo"); 
    } 

    public ActionResult Bar() 
    { 
     return View("Bar"); 
    } 

} 

的 「foo」 的視圖:

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage" MasterPageFile="~/Views/Shared/Site.Master"%> 

<asp:Content ContentPlaceHolderID="MainContent" runat="server"> 
    <%= Html.ActionLink("link 1", "Bar") %> 

    <a href="<%= ViewData["Link2"]%>">link 2</a> 
</asp:Content> 

回答

1

foo的方法實際上是不太容易測試,因爲它從使用.URL屬性(類型UrlHelper的) TestController的基類不是預先填充的。如果你想沿着UrlHelper對象的路徑,那麼下面的文章描述瞭如何去做這件事 - ASP.NET MVC: Unit testing controllers that use UrlHelper

在另一方面,酒吧的方法,是更容易測試,因爲它不使用Controller.Url屬性:

[TestMethod] 
public void BarRouteReturnsBarViewResult() 
{ 
    // Arrange 
    var controller = new TestController(); 

    // Act 
    var result = controller.Bar() as ViewResult; 

    // Assert 
    Assert.AreEqual(result.ViewName, "Bar"); 
} 
+0

感謝。我會澄清我的問題,因爲Foo是我感興趣的。關聯問題中的答案非常重要,我很驚訝它需要做很多測試,並希望有一個更快的方法。 – 2010-04-29 17:04:52