Необходимо выполнить модульное тестирование ActionMethod контроллера, который возвращает RedirectResult вместе с тегом привязки

Вот оператор возврата контроллера:

var url = Url.Action("method", "controller", new { id = id }) + "#anchor-tag";
return new RedirectResult(url);

Итак, в моем методе тестирования мне нужно назначить контроллер (sut) UrlHelper, чтобы я не получил исключение нулевой ссылки. Я использую FakeItEasy, чтобы издеваться над HttpContext:

sut.Url = new UrlHelper(new RequestContext(A.Fake<HttpContextBase>(), new RouteData()), new RouteCollection());

похоже, это работает нормально, но когда я хочу доказать, что метод действия контроллера перенаправлен на правильный метод и контроллер:

var redirectResult = sut.DoSomething(input);

Я не могу извлечь RouteValues, как могу, когда действие контроллера возвращает RedirectToRouteResult. иначе:

Assert.That(redirectResult.RouteValues["id"], Is.EqualTo(Id));

b / c RedirectResult не позволяет мне получить доступ к этим переменным. Также, если я попытаюсь разыграть это:

var redirectResult = (RedirectToRouteResult)sut.DoSomething(input);

Я получаю ошибку кастинга.

Мне нужно иметь возможность проверить, перенаправляет ли контроллер в соответствующее место, но я не могу этого сделать, потому что Url.Action(...) должен работать внутренне с другими элементами, такими как RouteData, RouteCollection и т. Д.

кто-нибудь знает, как я могу предварительно заполнить данные "маршрута", которые мне нужны в моем тесте, используя ControllerContext:

sut.ControllerContext = new ControllerContext(requestContext, sut);

для того, чтобы получить Url.Action выплевывать правильные значения мне обратно в тесте?

Спасибо! Майк

1 ответ

Если я правильно понимаю ваш вопрос, вы хотите проверить URL, возвращенный при возврате RedirectResult.

Вы можете просто сделать что-то вроде этого:

var result = (RedirectResult) aec.Result;

И тогда result.Url.AbsoluteURI содержит строковое значение, которое вы можете проанализировать

Другие вопросы по тегам