2010-04-19 2 views
1

J'essaie de créer des tests unitaires pour m'assurer que mes méthodes d'extension pour UrlHelper fonctionnent? Est-ce que quelqu'un sait comment faire ça? J'utilise MVC 1.0 et MvcContrib. Je peux tester les routes mais ne peut pas tester le code comme ceci:Unité de test Méthodes d'extension UrlHelper

public static string MoreFloorplans(this UrlHelper urlHelper, long productID, int pageIndex) 
    { 
    return urlHelper.Action<CatalogController>(x => x.GetRelatedProducts(productID, pageIndex)); 

    } 

Répondre

0

Pour créer un UrlHelper, vous avez besoin d'un RequestContext. Afin de créer un fonctionnement RequestContext, vous avez besoin d'un HttpContextBase et un RouteData. La seconde, RouteData, devrait être simple à construire. Le HttpContextBase, vous devez vous moquer.

Pour cela, je vous suggère de regarder MvcMockHelpers de Scott H. Certaines parties sont un peu anciennes, mais je pense que c'est assez bon pour ce test particulier - tout ce dont vous avez vraiment besoin est la méthode FakeHttpContext et ses dépendances. Si vous allez chercher cette bibliothèque, votre code ressemblerait à quelque chose comme:

[TestMethod] 
public void Can_write_more_floorplans() 
{ 
    const long productID = 12345; 
    const int pageIndex = 10; 

    var httpContext = FakeHttpContext(); // From the MvcMockHelpers 
    var routeData = new RouteData(); 
    var requestContext = new RequestContext(httpContext, routeData); 
    var urlHelper = new UrlHelper(requestContext); 
    string floorplans = MoreFloorplans(urlHelper, productID, pageIndex); 
    Assert.AreEqual(some_string, floorplans); 
} 

Je sais que vous dites que vous essayez d'utiliser le projet MvcContrib TestHelper, mais pour autant que je sache, cette bibliothèque est tout au sujet des tests contrôleurs. Je ne suis pas sûr que ce soit assez granulaire pour tester un composant de niveau inférieur. Vous n'avez pas vraiment besoin de tout ce qu'il y a dedans de toute façon; tout ce dont vous avez besoin est un RequestContext.

+0

merci, je vais essayer ça – fregas

4

J'ai suivi les instructions d'Aaronaught et de Scott H, mais il a fallu faire des gaffes. J'ai fini avec quelque chose comme ça.

public UrlHelper GetUrlHelper(
     string fileName = "/", 
     string url="http://localhost", 
     string queryString="") 
{ 
    // Use routes from actual app 
    var routeCollection = new RouteCollection(); 
    MvcApplication.RegisterRoutes(routeCollection); 

    //Make a request context 
    var request = new HttpRequest(fileName, url, queryString); 
    var response = new HttpResponse(new StringWriter()); 
    var httpContext = new HttpContext(request, response); 
    var httpContextBase = new HttpContextWrapper(httpContext); 
    var requestContext = new RequestContext(httpContextBase, new RouteData()); 

    // Make the UrlHelper with empty route data 
    return new UrlHelper(requestContext, routeCollection); 
} 

public void MoreFloorplans_ReturnsExpectedUrl() 
{ 
    var urlHelper = GetUrlHelper(); 
    var actualResult = urlHelper.MoreFloorPlans(1,2); 
    Assert.AreEqual("/MoreFloorPlans/1/2", actualResult); 
} 

Notez que vous devriez tester votre méthode d'extension, pas UrlHelper elle-même, la mise si le RouteData dans le RequestContext est probablement hors de portée.