单元测试ASP.NET MVC重定向

单元测试ASP.NET MVC重定向

Unit testing ASP.NET MVC redirection

如何对MVC重定向进行单元测试?

1
2
3
4
5
6
7
8
9
10
public ActionResult Create(Product product)
{
    _productTask.Save(product);
    return RedirectToAction("Success");  
}

public ActionResult Success()
{
     return View();
}

在预览5中,Ayende的方法是否仍然是最佳方法?

1
2
3
4
 public static void RenderView(this Controller self, string action)
 {
    typeof(Controller).GetMethod("RenderView").Invoke(self,new object[] { action} );
 }

这样做似乎有些奇怪,尤其是当MVC团队表示他们正在编写可测试的框架时。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[TestFixture]
public class RedirectTester
{
    [Test]
    public void Should_redirect_to_success_action()
    {
        var controller = new RedirectController();
        var result = controller.Index() as RedirectToRouteResult;
        Assert.That(result, Is.Not.Null);
        Assert.That(result.Values["action"], Is.EqualTo("success"));
    }
}

public class RedirectController : Controller
{
    public ActionResult Index()
    {
        return RedirectToAction("success");
    }
}

这适用于使用NUnit的ASP.NET MVC 5:

1
2
3
4
5
6
7
8
    [Test]
    public void ShouldRedirectToSuccessAction()
    {
        var controller = new RedirectController();
        var result = controller.Index() as RedirectToRouteResult;

        Assert.That(result.RouteValues["action"], Is.EqualTo("success"));
    }

如果要测试要重定向到其他控制器(例如NewController),则断言为:

1
Assert.That(result.RouteValues["controller"], Is.EqualTo("New"));


您可以使用Mvc.Contrib.TestHelper提供用于测试重定向的断言。 看看http://kbochevski.blogspot.com/2010/06/unit-testing-mvcnet.html和代码示例。 这可能会有所帮助。


您可以对返回的ActionResult进行断言,需要将其强制转换为适当的类型,但它确实允许您使用基于状态的测试。 在网络上进行搜索应该会找到一些有用的链接,尽管这里只是一个。


推荐阅读