При выполнении модульного теста метод расширения UrlHelper всегда не соответствует маршруту на основе имени маршрута - PullRequest
1 голос
/ 29 декабря 2011

... но тот же метод расширения работает, когда выполняется само приложение. Сам метод расширения 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 (извинения за тупое запутывание; лучше, чем потом сожалеть): code snippet

Кто-нибудь знает, как я могу написать модульные тесты, которые обращаются к методам расширения 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;
    

    }

1 Ответ

1 голос
/ 29 декабря 2011

Я понял это. Мне нужно было передать мою коллекцию RouteCollection в AreaRegistrationContext, а не передавать новую коллекцию RouteCollection:

            var productFindingAreaRegistrationContext = new AreaRegistrationContext(productFindingAreaRegistration.AreaName, allRoutes);

Но это вызвало взрыв этой линии:

productFindingAreaRegistrationContext.Routes.ForEach(r => allRoutes.Add(r));

Однако теперь эта строка больше не нужна, поэтому я закомментировал ее. Вуаля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...