Методы расширения UrlHelper для модульного тестирования

Я пытаюсь создать модульные тесты, чтобы убедиться, что мои методы расширения для UrlHelper работают? Кто-нибудь знает как это сделать? Я использую MVC 1.0 и MvcContrib. Я могу проверить маршруты, но не могу проверить такой код:

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

    }

person fregas    schedule 19.04.2010    source источник


Ответы (2)


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

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, вероятно, выходит за рамки.

person Craig Celeste    schedule 23.07.2010

Чтобы создать UrlHelper, вам нужен RequestContext. Чтобы создать функционирующий RequestContext, вам нужны HttpContextBase и RouteData. Второй, RouteData, должен быть простым в построении. HttpContextBase, вы должны издеваться.

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

person Aaronaught    schedule 19.04.2010