Как выполнить модульное тестирование перенаправления MVC?
public ActionResult Create(Product product)
{
_productTask.Save(product);
return RedirectToAction("Success");
}
public ActionResult Success()
{
return View();
}
Подход Айенде по-прежнему лучший вариант с предварительным просмотром 5:
public static void RenderView(this Controller self, string action)
{
typeof(Controller).GetMethod("RenderView").Invoke(self,new object[] { action} );
}
Кажется странным делать это, тем более что команда MVC заявила, что они пишут фреймворк для тестирования.





Вы можете утверждать возвращаемый ActionResult, вам нужно будет привести его к соответствующему типу, но он позволяет использовать тестирование на основе состояния. Поищите в Интернете несколько полезных ссылок, но вот только один.
[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");
}
}
Кто-нибудь знает, как вы действительно можете вызвать действие при перенаправлении во время тестирования?
@ f0ster Зачем вам это нужно? В любом случае controller.Success() в приведенном выше примере выполнит это.
вы можете использовать Mvc.Contrib.TestHelper, который предоставляет утверждения для тестирования перенаправлений. Взгляните на http://kbochevski.blogspot.com/2010/06/unit-testing-mvcnet.html и пример кода. Это может быть полезно.
Согласно Часто задаваемые вопросы"Be careful, because the community frowns on overt self-promotion and tends to vote it down and flag it as spam. Post good, relevant answers, and if they happen to be about your product or website, so be it. However, you must disclose your affiliation in your answers. Also, if a huge percentage of your posts include a mention of your product or website, you're probably here for the wrong reasons."
Это работает для 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"));
RedirectToRouteResult.Values [] теперь RedirectToRouteResult.RouteValues [...]