代码之家  ›  专栏  ›  技术社区  ›  Frank Schwieterman

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

  •  1
  • Frank Schwieterman  · 技术社区  · 14 年前

    假设我有一个要测试的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");
        }
    
    }
    

    <%@ 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 回复  |  直到 11 年前
        1
  •  1
  •   Community M-A    7 年前

    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");
    }