Контроллер модульного тестирования MVC 3, но GetVirtualPathData отправляет странные результаты VirtualPathData - PullRequest
1 голос
/ 26 мая 2011

Я сталкиваюсь со странным поведением при модульном тестировании контроллера. Я использую некоторые методы расширения для построения Url.Action, и все работает хорошо при запуске кода в производстве, но модульное тестирование не проходит. На самом деле мой пользовательский помощник Url.Action использует метод:

System.Web.Routing.RouteCollection.GetVirtualPathData

точная строка:

VirtualPathData localizedPathData = HtmlExtensions.GetVirtualPathData (newRouteTable, Url.RequestContext, routingValues);

строка URL = localizedPathData.VirtualPath.ToLower ();

Проблема в том, что при модульном тестировании localizedPathData.VirtualPath представляет собой пустую строку вместо URL-адреса для маршрута, как в рабочем коде. RouingValues ​​содержит три ключа «area», «controller», «action» со связанными значениями с контроллером / action, для которых я хотел бы создать URL-адрес. Что странно, localizedPathData.Route свойство содержит правильный маршрут ! Так почему localizedPathData.VirtualPath является пустой строкой?

Я пытался с GetVirtualPathForArea, но результат тот же.

Я издеваюсь с MvcContrib TestControllerBuilder.

Пример кода здесь:

    // Arrange 
var loginInput = new LoginInput { EmailAddress = "test@test.fr", Password = "test", RememberMe = false };

new RouteConfigurator().RegisterRoutes(() => new ResumeAreaRegistration().RegisterArea(new AreaRegistrationContext("Resume", RouteTable.Routes)));

var testControllerBuilder = new TestControllerBuilder(); 
var loginController = testControllerBuilder.CreateController<LoginController>();
loginController.Url = new UrlHelper(new RequestContext(loginController.HttpContext, new RouteData()), RouteTable.Routes);
loginController.Url.RequestContext.RouteData.Values.Add("area","Resume");
loginController.Url.RequestContext.RouteData.Values.Add("culture","en-US");

const string defaultUrl = "/Dashboard";
// act 

var result = loginController.Index(loginInput, null);

// assert 

result.ShouldNotBeNull();
result.AssertHttpRedirect().Url.ShouldBe(defaultUrl);

Может быть, я что-то упустил? Что-то, о чем я забыл?

Заранее благодарю за помощь.

1 Ответ

1 голос
/ 29 мая 2011

Я искал Reflector и обнаружил, что причина, по которой он не работает, заключается в том, что внутренне объект RouteCollection вызывает метод ApplyAppPathModifier для HttpResponseBase. Исправление будет состоять в том, чтобы настроить ожидание для метода ApplyAppPathModifier макета HttpResponseBase, чтобы просто возвращать переданное ему значение. Если вы используете Rhino Mocks, то это будет выглядеть так:

loginController.HttpContext.Response.Stub(x => x.ApplyAppPathModifier(Arg<string>.Is.Anything)).IgnoreArguments().Do((Func<string, string>)((arg) => { return arg; }));
...