Попытка выполнить блок-тестирование контроллера в моем веб-приложении ASP.NET MVC 3.
Мой тест выглядит следующим образом:
[TestMethod]
public void Ensure_CreateReviewHttpPostAction_RedirectsAppropriately()
{
// Arrange.
var newReview = CreateMockReview();
// Act.
var result = _controller.Create(newReview) as RedirectResult;
// Assert.
Assert.IsNotNull(result, "RedirectResult was not returned");
}
Довольно просто. В основном тестируем действие [HttpPost]
, чтобы обеспечить возврат RedirectResult
(шаблон PRG). Я не использую RedirectToRouteResult
, потому что ни одна из перегрузок не поддерживает привязные ссылки. Двигаемся дальше.
Теперь я использую Moq, чтобы высмеять Контекст Http, включая переменные сервера, контекст контроллера, сеанс и т.д. Все идет хорошо.
Пока я не ударил эту строку в моем методе действий:
return Redirect(Url.LandingPageWithAnchor(someObject.Uri, review.Uri);
LandingPageWithAnchor
- это специальный HTML-помощник:
public static string LandingPageWithAnchor(this UrlHelper helper, string uri1, string uri2)
{
const string urlFormat = "{0}#{1}";
return string.Format(urlFormat,
helper.RouteUrl("Landing_Page", new { uri = uri1}),
uri2);
}
В принципе, я перенаправляюсь на другую страницу, которая является "целевой страницей" для нового контента, с привязкой к новому обзору. Круто.
Теперь этот метод не выполнялся раньше, потому что UrlHelper
был null.
Итак, я сделал это в своем издевательском:
controller.Url = new UrlHelper(fakeRequestContext);
Который получил его дальше, но теперь он не работает, потому что таблицы маршрута не содержат определения для "Landing_Page".
Итак, я знаю, что мне нужно высмеять "что-то", но я не уверен, что это:
a) Таблицы маршрутов
b) Метод UrlHelper.RouteUrl
c) Метод расширения UrlHelper.LandingPageWithAnchor, который я написал
Может ли кто-нибудь дать некоторые рекомендации?
ИЗМЕНИТЬ
Этот конкретный маршрут находится в Области, поэтому я попытался вызвать регистрацию области в моем unit test:
AreaRegistration.RegisterAllAreas();
Но я получаю InvalidOperationException
:
Этот метод не может быть вызван во время этапа инициализации перед запуском приложения.