2010-04-19 69 views
1

我想創建單元測試,以確保我的UrlHelper的擴展方法工作?有誰知道如何做到這一點?我使用MVC 1.0和MvcContrib。我可以測試線路,但這樣無法測試代碼:單元測試UrlHelper擴展方法

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

    } 

回答

0

爲了創建一個UrlHelper,你需要一個RequestContext。爲了創建功能RequestContext,您需要一個HttpContextBase和一個RouteData。第二,RouteData,應該是直接構建。 HttpContextBase,你必須嘲笑。

爲此,我建議你看看Scott H的MvcMockHelpers。其中的一部分有點舊,但我認爲對於這個特定的測試已經夠用了 - 你真正需要的是FakeHttpContext方法及其依賴關係。如果你去拿起庫,你的代碼看起來是這樣的:

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

我知道你說你想使用MvcContrib TestHelper項目,但據我所知,該庫是所有關於測試控制器。我不確定它是否足夠精細以測試較低級別的組件。無論如何,你並不需要所有的東西。所有你需要的是一個RequestContext

+0

謝謝我會試試看 – fregas 2010-04-19 21:32:56

4

我遵循了Aaronaught和Scott H的指示,但它花了一些時間。我結束了這樣的事情。

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

請注意,您應該測試您的擴展方法,而不是UrlHelper本身,因此,在設置中的RequestContext中的RouteData可能是超出了範圍。