2008-09-12 156 views
16

我如何測試MVC重定向?單元測試ASP.NET MVC重定向

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

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

Ayende's方法仍然以最好的方式,與預覽5:

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

似乎很奇怪有這樣做,尤其是在MVC團隊已經表示,他們正在編寫的框架內測試。

回答

28
[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"); 
    } 
} 
+9

RedirectToRouteResult.Values []現在是RedirectToRouteResult.RouteValues [...] – mxmissile 2009-07-07 19:46:12

+0

沒有人知道在測試期間如何實際調用重定向時調用的操作? – f0ster 2010-01-06 21:02:48

-1

您可以在返回的ActionResult上聲明,您需要將其轉換爲適當的類型,但它確實允許您使用基於狀態的測試。在網上搜索應該找到一些有用的鏈接,這裏的just one雖然。

0

這適用於ASP.NET MVC 5使用NUnit:

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