151

ApiController の単体テストを作成しようとしていて、いくつかの問題に直面しました。Request.CreateResponse と呼ばれる優れた拡張メソッドがあり、応答の生成に大いに役立ちます。

public HttpResponseMessage Post(Product product)
{
  var createdProduct = repo.Add(product);
  return this.Request.CreateResponse(HttpStatusCode.Created, createdProduct);
}

部分モックを使用したり、「new HttpResponseMessage(...)」を直接使用したりせずに CreateResponse をモックする方法はありますか?

4

5 に答える 5

246

これを解決する別の方法は、次のことです。

controller.Request = new HttpRequestMessage();
controller.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, 
                                  new HttpConfiguration());

webapi 5.0 にアップグレードする場合は、これを次のように変更する必要があります。

controller.Request = new HttpRequestMessage();
controller.Request.SetConfiguration(new HttpConfiguration());

これを行う必要があるのは、コントローラーにデータを入力する必要があるためです。Requestそうしないと、拡張メソッドが機能しRequestません。またHttpConfiguration、リクエストにセットを設定する必要があります。そうしないと、ルーティングやパイプラインの他の部分が正しく機能しません。

于 2012-06-08T21:00:55.927 に答える
24

次のように、テスト容易性のためにコントローラー オブジェクトを設定できます。

var config = new HttpConfiguration();
var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/api/products");
var route = config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}");
var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "controller", "products" } });

controller.ControllerContext = new HttpControllerContext(config, routeData, request);
controller.Request = request;
controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;

Unit Testing ASP.NET Web APIに関する Peter Provost の包括的なブログ投稿からコピー。

于 2013-02-20T08:58:21.583 に答える