2008-09-12 27 views
16

Jak mogę przetestować przekierowanie MVC?Testowanie jednostek Przekierowanie MVC ASP.NET

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

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

Czy Ayende's podejście nadal najlepszym sposobem, aby przejść z podglądu 5:

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

wydaje się dziwne, aby to zrobić, zwłaszcza, że ​​zespół MVC powiedział piszą ram być testowalny.

Odpowiedz

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 ​​[] jest teraz RedirectToRouteResult.RouteValues ​​[...] – mxmissile

+0

czy ktoś wie, w jaki sposób można faktycznie wywołać akcję podczas przekierowania podczas testowania? – f0ster

+0

@ f0ster Dlaczego chcesz tego? Tak czy inaczej, 'controller.Success()' w powyższym przykładzie może to osiągnąć. – bzlm

-1

Możesz potwierdzić na ActionResult, który jest zwracany, musisz rzucić go do odpowiedniego typu, ale pozwala na korzystanie z testów opartych na stanie. Wyszukiwanie w sieci powinno znaleźć kilka przydatnych linków, ale tutaj jest just one.

-1

można użyć Mvc.Contrib.TestHelper, który zapewnia asercje do testowania przekierowań. Spójrz na http://kbochevski.blogspot.com/2010/06/unit-testing-mvcnet.html i przykładowy kod. To może być pomocne.

+0

Zgodnie z [FAQ] (http://stackoverflow.com/faq#promotion) '" Uważaj, ponieważ społeczność marszczy brwi na jawnej autopromocji i ma skłonność do głosowania i oznaczania jej jako spamu. Zamieszczaj dobre, trafne odpowiedzi , a jeśli zdarzy się, że dotyczą Twojego produktu lub witryny, niech tak będzie, ale musisz ujawnić swoją przynależność w swoich odpowiedziach. Jeśli duży procent Twoich postów zawiera wzmiankę o Twoim produkcie lub witrynie, prawdopodobnie tutaj z niewłaściwych powodów. " – Will

0

Działa to dla ASP.NET MVC 5 stosując NUnit:

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

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

Jeśli chcesz sprawdzić, czy masz skierowanie do innego kontrolera (powiedzmy NewController), twierdzenie byłoby:

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