... но тот же метод расширения работает, когда выполняется само приложение. Сам метод расширения UrlHelper выглядит следующим образом:
public static string CategoryLandingPage(this UrlHelper helper, string seoCategoryName)
{
return helper.RouteUrl("Category", new { area = "SoAndSo", controller = "SoAndSo", action = "Category", seoCategoryName = seoCategoryName }, "http");
}
Я регистрирую этот конкретный маршрут, как этот, в моем классе SoAndSoAreaRegistration:
context.MapRoute(
"Category",
"category/{seoCategoryName}",
new { area = "SoAndSo", controller = "SoAndSo", action = "Category", seoCategoryName = string.Empty }
);
... и я снял точку останова на этой регистрации, чтобы гарантировать, что тестер попадет в нее.
Когда я запускаю тест, я получаю ArgumentException: «Не удалось найти маршрут с именем« Категория »в коллекции маршрутов. Имя параметра: имя».
Я предполагаю, что нам не нужно указывать имя маршрута и достаточно параметров маршрута (имя области / контроллера / действия / категории), чтобы построить маршрут полностью, как мы делаем здесь, но я не могу понять, куда исчезает название маршрута во время тестирования. Удаление имени категории устраняет исключение и позволяет пройти тест, но я все же хотел бы понять, куда исчезает имя маршрута при тестировании. Упрощение кода, как это все еще взрывается во время выполнения:
public static string CategoryLandingPage(this UrlHelper helper, string seoCategoryName)
{
return helper.RouteUrl("Category");
}
Если я перебираю коллекцию маршрутов во время выполнения, я могу найти категорию маршрута, но нет никаких признаков свойства .Name, и я не вижу ни имени маршрута ("Категория" с заглавной буквой C), ни Свойства UrlHelper (извинения за тупое запутывание; лучше, чем потом сожалеть):
Кто-нибудь знает, как я могу написать модульные тесты, которые обращаются к методам расширения UrlHelper, которые ссылаются на маршруты по их именам? Спасибо!
Обновление -
Я добавлю некоторые инициализации теста, большинство из которых я получил из этого популярного вопроса , слегка модифицированного, чтобы учесть тот факт, что приложение, с которым я работаю, разделено на несколько областей MVC:
частный SoAndSoController CreateController ()
{
var service = new Mock ();
var cookieMgr = new Mock ();
var logger = new Mock ();
var allRoutes = new RouteCollection();
MvcApplication.RegisterRoutes(allRoutes);
var soAndSoAreaRegistration = new SoAndSoAreaRegistration();
var soAndSoAreaRegistrationContext = new AreaRegistrationContext(soAndSoAreaRegistration.AreaName, new RouteCollection());
soAndSoAreaRegistration.RegisterArea(soAndSoAreaRegistrationContext);
soAndSoAreaRegistrationContext.Routes.ForEach(r => allRoutes.Add(r));
var request = new Mock<HttpRequestBase>();
request.SetupGet(x => x.ApplicationPath).Returns("/");
request.SetupGet(x => x.Url).Returns(new Uri("http://localhost/a", UriKind.Absolute));
request.SetupGet(x => x.ServerVariables).Returns(new System.Collections.Specialized.NameValueCollection());
var response = new Mock<HttpResponseBase>();
response.Setup(x => x.ApplyAppPathModifier("/post1")).Returns("http://localhost/post1");
var context = new Mock<HttpContextBase>();
context.SetupGet(x => x.Request).Returns(request.Object);
context.SetupGet(x => x.Response).Returns(response.Object);
var controller = new SoAndSoController(service.Object, cookieMgr.Object, null, logger.Object, null);
controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller);
controller.Url = new UrlHelper(new RequestContext(context.Object, new RouteData()), allRoutes);
return controller;
}