首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元测试UrlHelper扩展方法

单元测试UrlHelper扩展方法
EN

Stack Overflow用户
提问于 2010-04-20 04:41:52
回答 2查看 2.2K关注 0票数 1

我正在尝试创建单元测试,以确保我的UrlHelper扩展方法有效?有人知道怎么做吗?我使用的是MVC1.0和MvcContrib。我可以测试路由,但不能像这样测试代码:

代码语言:javascript
复制
    public static string MoreFloorplans(this UrlHelper urlHelper, long productID, int pageIndex)
    {
     return urlHelper.Action<CatalogController>(x => x.GetRelatedProducts(productID, pageIndex));

    }
EN

回答 2

Stack Overflow用户

发布于 2010-07-23 20:56:00

我听从了宇航员和斯科特·H的指示,但这花了我一些时间。我最终得到了类似这样的东西。

代码语言:javascript
复制
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可能超出了范围。

票数 4
EN

Stack Overflow用户

发布于 2010-04-20 05:05:49

为了创建UrlHelper,您需要一个RequestContext。为了创建一个正常运行的RequestContext,您需要一个HttpContextBase和一个RouteData。第二个是RouteData,构造起来应该很简单。HttpContextBase,你不得不嘲笑它。

为此,我建议你看看Scott H的MvcMockHelpers。其中的一部分有点陈旧,但我认为它对于这个特定的测试已经足够好了--您真正需要的就是FakeHttpContext方法及其依赖项。如果你拿起这个库,你的代码看起来会像这样:

代码语言:javascript
复制
[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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2670720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档