17

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

public ActionResult Create(Product product)
{
    _productTask.Save(product);
    return RedirectToAction("Success");   
}

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

Ayende 的方法仍然是最好的方法吗,预览 5:

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

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

4

4 回答 4

29
[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");
    }
}
于 2008-09-12T12:29:02.860 回答
0

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

    [Test]
    public void ShouldRedirectToSuccessAction()
    {
        var controller = new RedirectController();
        var result = controller.Index() as RedirectToRouteResult;

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

如果你想测试你正在重定向到不同的控制器(比如 NewController),断言将是:

Assert.That(result.RouteValues["controller"], Is.EqualTo("New"));
于 2016-01-26T15:27:03.423 回答
-1

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

于 2008-09-12T12:09:53.030 回答
-1

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

于 2010-06-16T22:05:38.470 回答