1

我正在尝试创建单元测试以确保我的 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));

    }
4

2 回答 2

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 可能超出范围。

于 2010-07-23T12:55:59.570 回答
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);
}

我知道您说您正在尝试使用 MvcContribTestHelper项目,但据我所知,该库都是关于测试控制器的。我不确定它是否真的足够细化以测试较低级别的组件。无论如何,您并不真的需要那里的所有东西。你只需要一个RequestContext.

于 2010-04-19T21:05:49.373 回答