1

我有一个带有路由的 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());

失败:

    Assert.AreEqual(ReflectionHelper.GetMethodName((ReadingAlertsController p) => p.GetAll(null)), routeTester.GetActionName());

我试过传入一个实际的过滤器对象而不是 null 但这根本不会改变结果。

我知道我可以通过创建两条不同的路由来修复它,但我有点不情愿,因为当前路由确实适用于除单元测试之外的所有内容。

有什么建议么?

4

2 回答 2

1

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

于 2013-03-13T07:00:28.250 回答
0

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

这是另一篇具有类似实现的文章。这就是我正在使用的并且有类似的问题。

- 更新 -

我相信我找到了解决问题的方法。使用上面提到的文章,我将“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;  
        }
    }
于 2013-03-15T13:57:23.763 回答