0

4 つのメソッド (CRUD 操作ごとに 1 つ) を含む単純な Web API コントローラーを mvc4 に作成しました。フィドラーを使用して、コントローラーのメソッドが機能することをテストできます。

私は今、これらが機能することを証明するために単体テストを作成しようとしています。クライアント側のオブジェクトを json 形式にシリアル化できましたが、この json の文字列を使用して実際にメソッドを呼び出すにはどうすればよいでしょうか?

それが役立つ場合は、Json.NET を使用してクライアント オブジェクトをシリアル化していますが、この拡張機能が実際にサーバーへの配信と取得を処理しているとは思いません。

4

3 に答える 3

1

単体テストはコントローラーに対して記述する必要があります。そのため、Web API コードを単体テストするために実際の HTTP 要求を行う必要はなく、メソッドを呼び出すだけです。

設計の観点から、安らかな Web API が必要な場合、クライアントは要求をシリアル化せずに標準の HTTP メッセージを送信できる必要があります。

于 2012-11-14T19:51:58.313 に答える
0

ここでnick_wによって提示されたコードは正しいです。オブジェクトを使用する必要がありHttpClientます。そして、Steve Fentonが述べたように、単体テストを作成するには、それを実行するのではなく、コントローラーに対して直接テストします。しかし、機能テストの場合はそれを行うことができます。私も同じことをしました。ヘルパークラスを作成したので、GETまたはPOSTなどに応じて、Httpヘルパーメソッドの1つを呼び出すだけで済みます。このヘルパーはジェネリック型を使用するため、渡されたすべての型で動作します。

于 2012-11-14T22:16:14.583 に答える
0

これは、安静な Web API にオブジェクトを投稿するために私が使用した種類のアプローチです。

HttpResponseMessage response;
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://url_to_service");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

var responseTask = client.PostAsJsonAsync("api/resource/somethingelse", someObjectToPost).Result;
responseTask.Wait();
response = responseTask.Result;

if (response.IsSuccessStatusCode)
{
    var contentTask = response.Content.ReadAsAsync<SomeResponseType>();
    contentTask.Wait();
    SomeResponseType responseContent = contentTask.Result;
}
else
{
    //Handle error.
}

この場合、someObjectToPostはクライアント側オブジェクトですが、Web API に任せてシリアル化することもできます。上記の例では、応答が架空のタイプであると想定しています。応答がプレーンテキストであると予想される場合にSomeResponseTypeも使用できます。ReadAsStringAsync

于 2012-11-14T20:24:44.990 に答える