如何对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进行断言,需要将其强制转换为适当的类型,但它确实允许您使用基于状态的测试。 在网络上进行搜索应该会找到一些有用的链接,尽管这里只是一个。