2013-03-07 1 views
2

Бит нуб с тестированием так, пожалуйста, медведь со мной,Url.Action становится нулевой, когда в JSON строку

У меня есть контроллер, который возвращает JsonResult, который содержит строку, вычисленную Url.Action так:

public ActionResult GetResult(SomeModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     return Json(new { redirectTo = Url.Action("Index", "Profile") }); 
    } 
} 

И приложение работает отлично, когда я использую этот результат с помощью jQuery.

Однако во время моего модульного тестирования у меня возникают проблемы, потому что, когда я проверяю содержимое строки Json, значение redirectTo оказывается «нулевым», даже если оно не является нулевым в самом приложении.

Мой метод тестирования выглядит немного как это:

[Test] 
public void GetResult_Success() 
{ 
    var result = controller.GetResult(new SomeModel()); 

    Assert.IsNotNull(result); 
    Assert.IsInstanceOf<JsonResult>(result); 

    var jsonResult = result as JsonResult; 
    var jsonObject = JsonConvert.DeserializeAnonymousType(new JavaScriptSerializer().Serialize(jsonResult.Data), new 
    { 
     redirectTo = string.Empty 
    }); 

    Assert.AreEqual("Profile/Index", jsonObject.redirectTo); 
} 

Это терпит неудачу, потому что jsonObject.redirectTo является недействительным. Если в моем контроллере я изменяю Url.Action в «Профиль/Индекс», тест проходит. Однако Url.Action («Индекс», «Профиль») терпит неудачу, поскольку он становится нулевым только при модульном тестировании.

Если я попытаюсь настроить значения маршрута в настройке контекста для тестов, он жалуется, что они уже зарегистрированы. Я использую Moq. Любая идея, что мне нужно настроить? Большое спасибо заранее

+0

Это может быть то, что вы ищете? Я могу опубликовать более подробный ответ, если это так: http://codeswordsman.wordpress.com/2011/07/22/unit-testing-controllers-that-call-url-action-and-verify-correct-url/ –

+0

Эй, почти там! Теперь я получаю: Ожидаемая длина строки 13 но 8. Строки различаются по индексу 0. ОЖИДАЕТСЯ: «Профиль/Index» Но было: «/ Профиль» Так выглядит, как будто маршрутизация отличается от того, что одно из приложений (что очень странно, поскольку я использую одну и ту же таблицу маршрутизации). По крайней мере, это не пусто – Nick

+0

Ах, нет! Мой плохой, я забыл, что «индекс» исчезает, потому что это страница по умолчанию. Это сработало, спасибо – Nick

ответ

0

Ответ можно найти на this link

кодекса скопированной для более постоянству:

public static void SetupWithHttpContextAndUrlHelper(this Controller controller) 
{ 
    var routes = new RouteCollection(); 
    MvcApplication.RegisterRoutes(routes); 

    //setup request 
    var requestContextMock = new Mock<HttpRequestBase>(); 
    requestContextMock.Setup(r => r.AppRelativeCurrentExecutionFilePath).Returns("/"); 
    requestContextMock.Setup(r => r.ApplicationPath).Returns("/"); 

    //setup response 
    var responseMock = new Mock<HttpResponseBase>(); 
    responseMock.Setup(s => s.ApplyAppPathModifier(It.IsAny<string>())).Returns<string>(s => s); 

    //setup context with request and response 
    var httpContextMock = new Mock<HttpContextBase>(); 
    httpContextMock.Setup(h => h.Request).Returns(requestContextMock.Object); 
    httpContextMock.Setup(h => h.Response).Returns(responseMock.Object); 

    controller.ControllerContext = new ControllerContext(httpContextMock.Object, new RouteData(), controller); 
    controller.Url = new UrlHelper(new RequestContext(httpContextMock.Object, new RouteData()), routes); 
}