如何单元测试这个简单的ASP.NET MVC控制器

如何单元测试这个简单的ASP.NET MVC控制器

问题描述:

可以说我有一个简单的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> 

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