Ошибка при использовании MVContrib TestHelper

При попытке реализовать второй ответ на предыдущий вопрос, я получаю сообщение об ошибке.

Я реализовал методы так, как показано в сообщении, и первые три работают правильно. Четвертый (HomeController_Delete_Action_Handler_Should_Redirect_If_Model_Successfully_Delete) дает эту ошибку: Не удалось найти параметр с именем «контроллер» в коллекции значений результата.

Если я изменю код на:

actual 
    .AssertActionRedirect() 
    .ToAction("Index");

он работает правильно, но мне не нравится «волшебная строка» и я предпочитаю использовать лямбда-метод, который использовал другой постер.

Мой метод контроллера выглядит так:

    [HttpPost]
    public ActionResult Delete(State model)
    {
        try
        {
            if( model == null )
            {
                return View( model );
            }

            _stateService.Delete( model );

            return RedirectToAction("Index");
        }
        catch
        {
            return View( model );
        }
    }

Что я делаю неправильно?


person Brian McCord    schedule 04.06.2010    source источник


Ответы (1)


MVCContrib.TestHelper ожидает, что вы укажете имя контроллера при перенаправлении в действии Delete:

return RedirectToAction("Index", "Home");

Тогда вы сможете использовать строго типизированное утверждение:

actual
    .AssertActionRedirect()
    .ToAction<HomeController>(c => c.Index());

Другой альтернативой является написание собственного метода расширения ToActionCustom:

public static class TestHelperExtensions
{
    public static RedirectToRouteResult ToActionCustom<TController>(
        this RedirectToRouteResult result, 
        Expression<Action<TController>> action
    ) where TController : IController
    {
        var body = (MethodCallExpression)action.Body;
        var name = body.Method.Name;
        return result.ToAction(name);
    }
}

что позволит вам оставить перенаправление как есть:

return RedirectToAction("Index");

и проверьте результат следующим образом:

actual
    .AssertActionRedirect()
    .ToActionCustom<HomeController>(c => c.Index());
person Darin Dimitrov    schedule 05.06.2010
comment
Пользовательский метод расширения. Мне нравится эта альтернатива, и я использую ее. Мне не нравится указывать имя контроллера в RedirectToAction, и это прекрасно работает. - person John; 01.07.2013