2010-04-19 3 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, вы должны издеваться.

Для этого я предлагаю вам взглянуть на Скотта H's 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

4

Я следовал инструкциям от Аароноута и Скотта Х, но это заняло некоторое время. Я закончил с чем-то вроде этого.

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 себя, поэтому настройки RouteData в RequestContext, вероятно, из области видимости.

Смежные вопросы