【问题标题】:Mocking Asp.net FriendlyUrls模拟 Asp.net FriendlyUrls
【发布时间】:2014-02-21 16:03:05
【问题描述】:

有没有人嘲笑 FriendlyUrls 进行单元测试?

我正在编写一个需要模拟 asp.net FriendlyUrls 的测试。我需要专门模拟的调用是 Request.GetFriendlyUrlSegments()。我正在使用 MS 假货。

这是我目前的测试:

// Arrange
            var httpContext = TestHelper.StubHtppContext("", "http://localhost/content.aspx/area/controller/action/OtherRouteValue", "");
            var httpContextBase = new HttpContextWrapper(httpContext);

            RouteTable.Routes.MapRoute(
                "RouteName",
                "Area/{controller}/{action}/{id}/{OtherRoute}",
                new {action = "Index", id = UrlParameter.Optional, OtherRoute = UrlParameter.Optional});

            RouteTable.Routes.EnableFriendlyUrls();

            var segments = new List<String> {"Controller", "Action", "Id", "OtherRoute"};


            using (ShimsContext.Create())
            {
                ShimHttpContext.CurrentGet = () => httpContext;

                ShimFriendlyUrl.SegmentsGet = () => segments;

                // Act 
                RouteData result = MvcUtility.GetRouteValuesFromUrl();

                // Assert
                Assert.IsNotNull(result, "Expected RouteData to be created.");
            }

        }

被测系统的相关部分:

 public static RouteData GetRouteValuesFromUrl()
 {
    var request = System.Web.HttpContext.Current.Request;
    var segments = request.GetFriendlyUrlSegments();
    //Other code
 }

我希望分段使用我的 shim 获取并返回我的分段列表。

当我在 web 上下文中运行我的代码时,我只需要找到一种对其进行单元测试的方法,第一步是模拟 shim/stub 这个 request.GetFriendlyUrlSegments() 调用。

【问题讨论】:

  • 为了使您的代码可测试,您应该使用注入的HttpContextBase 而不是HttpContext.Current
  • @Slaks,这是一个很好的观点,但是我不清楚这将如何帮助我填充 Request.GetFriendlyUrlSegments() 的方法调用。你能详细说明一下吗?
  • 嗯;进一步看,它在这里无济于事,除非GetFriendlyUrlSegments 扩展方法的实现使用您可以伪造的数据。 (尝试反编译器?)
  • 好建议。检查 dll 显示该方法生成 (string)httpRequest.GetRouteData().DataTokens["FriendlyUrlFileExtension"] ?? string.Empty;

标签: asp.net unit-testing friendly-url microsoft-fakes


【解决方案1】:

根据 slaks 的建议,这里伪造的正确数据是 Request.RequestContext.RouteData。它需要一个带有“FriendlyUrlSegments”键的 DataToken。

修正后的工作测试:

var httpContext = TestHelper.StubHtppContext("", "http://localhost/content.aspx/area/controller/action/OtherRouteValue", "");
        var httpContextBase = new HttpContextWrapper(httpContext);

        RouteTable.Routes.MapRoute(
            "RouteName",
            "Area/{controller}/{action}/{id}/{OtherRoute}",
            new {action = "Index", id = UrlParameter.Optional, OtherRoute = UrlParameter.Optional});

        RouteTable.Routes.EnableFriendlyUrls();

        var segments = new List<String> {"Controller", "Action", "Id", "OtherRoute"};

        var requestContext = new StubRequestContext(httpContextBase, new RouteData());

        var mockedRouteData = new RouteData();
        mockedRouteData.DataTokens.Add("FriendlyUrlSegments", segments);

        requestContext.RouteDataGet = () => mockedRouteData;

        using (ShimsContext.Create())
        {
            ShimHttpContext.CurrentGet = () => httpContext;
            ShimHttpRequest.AllInstances.RequestContextGet = request => requestContext;

            // Act 
            RouteData result = MvcUtility.GetRouteValuesFromUrl();

            // Assert
            Assert.IsNotNull(result, "Expected RouteData to be created.");

【讨论】:

    猜你喜欢
    • 2014-01-07
    • 2020-03-13
    • 2014-03-03
    • 2013-10-04
    • 2015-04-23
    • 2013-02-22
    • 2010-09-29
    • 2011-02-09
    • 2016-05-12
    相关资源
    最近更新 更多