Необходимо выполнить модульное тестирование 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 содержит строковое значение, которое вы можете проанализировать