Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 路由中带有可选参数的RouteTester问题_C#_Unit Testing_Asp.net Web Api_Asp.net Web Api Routing - Fatal编程技术网

C# 路由中带有可选参数的RouteTester问题

C# 路由中带有可选参数的RouteTester问题,c#,unit-testing,asp.net-web-api,asp.net-web-api-routing,C#,Unit Testing,Asp.net Web Api,Asp.net Web Api Routing,我有一个带有路由的MVC4 WebApi项目,该项目使用路由中的可选“id”参数正常工作: routes.Add(new ApiRouteInfo { Name = this.AreaName.ToLower() + "_readingsplans", RouteTemplate = baseUrl + "/plans/readingalerts/{id}", Defaults = new

我有一个带有路由的MVC4 WebApi项目,该项目使用路由中的可选“id”参数正常工作:

        routes.Add(new ApiRouteInfo
        {
            Name = this.AreaName.ToLower() + "_readingsplans",
            RouteTemplate = baseUrl + "/plans/readingalerts/{id}",
            Defaults = new
            {
                area = this.AreaName.ToLower(),
                controller = "ReadingAlerts",
                id = RouteParameter.Optional
            }
        });
当发出实际请求时,路由会命中控制器方法中的GetAll或Get方法:

    public HttpResponseMessage GetAll(BaseQueryFilter filter)
    public HttpResponseMessage Get(int id)
但是在单元测试中,RouteTester对象总是命中Get方法,而不是GetAll

作品:

    Assert.AreEqual(ReflectionHelper.GetMethodName((ReadingAlertsController p) => p.Get(It.IsAny<int>())), routeTester.GetActionName());
我尝试传入一个实际的筛选器对象,而不是null,但这根本不会改变结果

我知道我可以通过创建两个不同的路由来修复它,但我有点不情愿,因为当前的路由除了单元测试之外,其他都可以

有什么建议吗?

你看了吗?它解释了很多关于单元测试web api的内容,可能对您很有用。

您看过吗?它解释了很多关于单元测试web api的内容,它可能对您很有用。

我找到了一个描述如何测试路由的方法。我正在使用类似的东西,我发现在网上,但我愿意尝试它

下面是另一个类似的实现。这就是我正在使用的,并且有类似的问题

--更新--

我相信我找到了解决问题的办法。使用上述文章,我将“GetActionDescriptor()”函数替换为以下函数:

private HttpActionDescriptor GetActionDescriptor()
    {
        if (controllerContext.ControllerDescriptor == null)
            GetControllerType();

        var actionSelector = new ApiControllerActionSelector();
        var results = actionSelector.GetActionMapping(controllerContext.ControllerDescriptor);
        try
        {
            return actionSelector.SelectAction(controllerContext);
        }
        catch 
        {
            var subActions = results[request.RequestUri.Segments.Last()];
            var action = subActions.FirstOrDefault(a => a.SupportedHttpMethods.First(m => m.Method == request.Method.Method) != null);
            return action;  
        }
    }
我找到了一个描述如何测试路线的方法。我正在使用类似的东西,我发现在网上,但我愿意尝试它

下面是另一个类似的实现。这就是我正在使用的,并且有类似的问题

--更新--

我相信我找到了解决问题的办法。使用上述文章,我将“GetActionDescriptor()”函数替换为以下函数:

private HttpActionDescriptor GetActionDescriptor()
    {
        if (controllerContext.ControllerDescriptor == null)
            GetControllerType();

        var actionSelector = new ApiControllerActionSelector();
        var results = actionSelector.GetActionMapping(controllerContext.ControllerDescriptor);
        try
        {
            return actionSelector.SelectAction(controllerContext);
        }
        catch 
        {
            var subActions = results[request.RequestUri.Segments.Last()];
            var action = subActions.FirstOrDefault(a => a.SupportedHttpMethods.First(m => m.Method == request.Method.Method) != null);
            return action;  
        }
    }

这是一篇有趣的文章,但不幸的是,这篇文章无助于解决我的问题。本文所涉及的任何测试都是对控制器方法本身的测试,我遇到的问题是当只测试路由时。最让我感到困惑的是,在调用API时,路由确实正常工作,只是RouteTester在测试中无法解析正确的路由/方法。那篇文章实际上是在测试控制器,而不是路由。我遇到了同样的问题。这是一篇有趣的文章,但不幸的是,这篇文章对我的问题没有帮助。本文所涉及的任何测试都是对控制器方法本身的测试,我遇到的问题是当只测试路由时。最让我感到困惑的是,在调用API时,路由确实正常工作,只是RouteTester在测试中无法解析正确的路由/方法。那篇文章实际上是在测试控制器,而不是路由。我遇到了同样的问题。