1

ルートのオプションの「id」パラメーターで正しく機能するルーティングを備えた MVC4 WebApi プロジェクトがあります。

        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 オブジェクトは常に GetAll ではなく Get メソッドにヒットします。

作品:

    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 の代わりに実際のフィルター オブジェクトを渡そうとしましたが、結果はまったく変わりません。

2 つの異なるルートを作成することで修正できることはわかっていますが、現在のルーティングは単体テスト以外のすべてで機能するため、少し気が進まないのです。

助言がありますか?

4

2 に答える 2

1

これを見ましたか?Web API の単体テストについて多くのことを説明しており、役に立つかもしれません。

于 2013-03-13T07:00:28.250 に答える
0

ルートをテストする方法を説明するスタックオーバーフロー スレッドを見つけました。ネットで見つけた似たようなものを使っていますが、試してみたいです。

同様の実装に関する別の記事を次に示します。これは私が使用しているもので、同様の問題があります。

- 更新しました -

問題の修正を見つけたと思います。上記の記事を使用して、「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 に答える