2010-03-05 5 views
3

Я пытаюсь выполнить тестирование кода, который я получил из примера DotNetOpenAuth, но мне трудно заставить UrlHelper работать в моих тестах.Unit Test Url.Action

Где-то на LogOn ActionResult на моем контроллере он вызывает следующий UrlHelper. Следующий пример - упрощенная версия ActionResult.

public ActionResult TestUrlHelper() 
{ 
    var test = Url.ActionFull("LogOnReturnTo"); 
    return View(); 
} 

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

[Test] 
public void TestTest() 
{ 
    AccountController controller = GetAccountController(); 
    var result = controller.TestUrlHelper(); 
} 

Это метод расширения для UrlHelper:

internal static Uri ActionFull(this UrlHelper urlHelper, string actionName) 
{ 
    return new Uri(urlHelper.RequestContext.HttpContext.Request.Url, 
        urlHelper.Action(actionName)); 

} 

Метод GetAccountController я получил из следующего question. Я попытался немного подстроить настройки к моим потребностям, но я должен признать, что полностью не понимаю.

private static AccountController GetAccountController() 
{ 
    var MockIFormsAuthentication = new Mock<IFormsAuthentication>(); 
    var MockIOpenIdRelyingParty = new Mock<IOpenIdRelyingParty>(); 
    var MockRealm = new Realm("http://www.google.be"); 

    var routes = new RouteCollection(); 
    MvcApplication.RegisterRoutes(routes); 

    var request = new Mock<HttpRequestBase>(MockBehavior.Strict); 
    request.SetupGet(x => x.ApplicationPath).Returns("/"); 
    request.SetupGet(x => x.Url).Returns(new Uri("http://localhost/Account/LogOnReturnTo", UriKind.Absolute)); 
    request.SetupGet(x => x.ServerVariables).Returns(new System.Collections.Specialized.NameValueCollection()); 

    var response = new Mock<HttpResponseBase>(MockBehavior.Strict); 
    response.Setup(x => x.ApplyAppPathModifier("/Account/LogOnReturnTo")).Returns("http://localhost/Account/LogOnReturnTo"); 

    var context = new Mock<HttpContextBase>(MockBehavior.Strict); 
    context.SetupGet(x => x.Request).Returns(request.Object); 
    context.SetupGet(x => x.Response).Returns(response.Object); 

    var Controller = new AccountController(MockIFormsAuthentication.Object, MockIOpenIdRelyingParty.Object, MockRealm); 
    Controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), Controller); 
    Controller.Url = new UrlHelper(new RequestContext(context.Object, new RouteData()), routes); 

    return Controller; 
} 

Ошибка я получаю:

HttpResponseBase.ApplyAppPathModifier ("/ Главная/LogOnReturnTo") вызов не удалось с притворным поведением Strict.

Любая помощь или толчок в правильном направлении, высоко ценится

+1

Возможно, вы захотите поиграть в MockBehavior.Loose, then :) That wo uld будет хорошей идеей в целом. –

ответ

2

MockBehavior.Strict будет

сделать макет ведут себя как «истинный Мок», поднимая исключения для всего, что не имеет соответствует ожидание.

(От де Moq wiki)

Итак, если вы установите MockBehavior в Loose, это:

никогда не бросает и значения возвращается по умолчанию или пустые массивы, перечислимых и т.д., если нет Ожидание установлено для члена