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

时间:2010-04-29 07:36:42

标签: asp.net asp.net-mvc

假设我有一个简单的ASP.NET MVC控制器,我想测试一下。我想测试控制器操作(在这种情况下为Foo)只返回指向另一个操作的链接(在本例中为Bar)。

您如何测试TestController.Foo? (第一个或第二个链接)

我的实现有两次相同的链接。一个传递url throw 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 个答案:

答案 0 :(得分:1)

Foo方法实际上不太容易测试,因为它使用了来自TestController的基类的.Url属性(类型为UrlHelper),该类未预先填充。如果您想沿着存根UrlHelper对象的路径前进,那么以下帖子将介绍如何解决这个问题 - ASP.NET MVC: Unit testing controllers that use UrlHelper

另一方面,Bar方法更容易测试,因为它不使用Controller.Url属性:

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

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

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