3

私は WebAPI コントローラーの単体テストを書いていますが、主張したい側面の 1 つは、パラメーターが一致することです。

私はFilip Wojcieszyn のブログで使用されている方法に従いましたが、これは正常に機能していますが、現在、そのアサーションを拡張しようとしています。

コントローラーには 3 つのアクションがあります (3 つすべてが実際の使用を通じて検証されています)。

[HttpGet]
public IEnumerable<Task> Get()

[HttpGet]
public IEnumerable<Task> Get(string elementType)

[HttpGet]
public Task Get(long id)

そして、私は次のコードを持っています

var actionSelector = new ApiControllerActionSelector();
var descriptor = actionSelector.SelectAction(_controllerContext);
return descriptor.GetParameters();

問題は、パラメーターなしのルートで descriptor.GetParameters() を呼び出すと、1 つのパラメーター (「長い ID」パラメーター) を含むコレクションが返されることです。

これだけを返し、他の 2 つのオーバーロードを返さない理由と、オーバーロードの可能性を取得できるかどうかを説明できる人はいますか?

4

1 に答える 1

3

この問題の原因は、呼び出されたルートが十分に具体的でなかったことです。

  • IDパラメーターをオプションにするルートがありました
  • コントローラーには、Get() の 3 つのオーバーロードがあります。
  • Get (long id) アクションが選択されたのは、'id' パラメーターが指定されていませんが、'id' パラメーターはオプションであり、したがってこのメソッドが適しているためです。

WebAPI は、一致するパラメーターの数が最も多いメソッドを選択します。この場合、コード行で

var descriptor = actionSelector.SelectAction(_controllerContext);

Get() を探していて Get(long id) が与えられていたため、予期しないアクションが選択されていました。

これを解決するために、構成したルートを 2 つに分割しました。1 つ目は「id」パラメーターを想定する (つまり、オプションではない) もので、「id」パラメーターを受け入れないより一般的なルートです。

その後、すべてがうまくいきました。

于 2012-10-17T15:06:34.707 に答える