2010-03-05 6 views
3

J'essaie de tester le code que j'ai obtenu à partir d'un exemple DotNetOpenAuth mais j'ai du mal à faire fonctionner l'UrlHelper dans mes tests.Unit Test Url.Action

Quelque part sur le résultat de l'action LogOn sur mon contrôleur, il appelle le UrlHelper suivant. L'exemple suivant est une version simplifiée de ce ActionResult.

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

Mon test ressemble à ceci:

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

Ceci est la méthode d'extension pour la UrlHelper:

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

} 

La méthode GetAccountController je suis arrivé de la question suivante. J'ai essayé d'ajuster un peu les réglages à mes besoins mais je dois admettre que je ne comprends pas tout à fait.

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; 
} 

L'erreur que je reçois est:

HttpResponseBase.ApplyAppPathModifier ("/ home/LogOnReturnTo") appel a échoué avec le comportement simulé Strict.

Toute aide ou un coup de pouce dans la bonne direction est très apprécié

+1

Vous voudrez peut-être swith à MockBehavior.Loose, alors :) Que wo Je serais une bonne idée en général. –

Répondre

2

MockBehavior.Strict se

Faire comme une maquette se comportent « vrai Mock », soulevant des exceptions pour tout ce qui n'a pas attente correspondante.

(De de Moq wiki)

Donc, si vous définissez votre MockBehavior-Loose, il:

ne lève jamais et renvoie des valeurs par défaut ou des tableaux vides, enumerables, etc. si aucune l'attente est fixée pour un membre