2012-06-03 18 views
126

私はApiControllerの単体テストを書こうとしていて、いくつかの問題に直面しています。 Request.CreateResponseと呼ばれるすばらしい拡張メソッドがあり、応答の生成に多くの助けになります。Request.CreateResponseを使用したASP.NET WebApiユニットテスト

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

部分モックの使用または直接「新HttpResponseMessage(...)」を使用せずにCreateResponseを模擬する方法はありますか?これを解決する

+1

は、なぜあなたは 'CreateResponse'をモックとしたいですか?返された 'HttpResponseMessage'' Content'と 'StatusCode'プロパティに正しい値が設定されていることをなぜ宣言しないのですか? – nemesv

+3

このメソッドはユニットテストを実行すると、構成が設定されていないことを除いて失敗します。 – asa

+1

私は面倒です。私はちょうどthis.Request.CreateResponse(HttpStatusCode.Accepted、createdProduct、GlobalConfiguration.Configuration)を書く必要がありました。 – asa

答えて

215

もう一つの方法は、次の操作を実行することです:

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

理由:

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

あなたが5.0をWEBAPIにアップグレードしている場合は、これを変更する必要がありますコントローラーにRequestが設定されている必要があるからです。そうしないと、Requestの拡張メソッドは機能しません。また、要求にHttpConfigurationを設定する必要があります。そうしないと、ルーティングやパイプラインの他の部分が正しく機能しません。

+0

はい、それもうまくいくかもしれませんが、Request.CreateResponseも動作するようです。 – asa

+4

GlobalConfiguration.Configurationを追加すると依然としてnullが返されます。リクエストは私のために働いていましたが、私のActionもUrl.Linkを呼び出していたので、これは私の問題の終わりではありませんでした。ルート名は定義されていませんでした。 – foolshat

+0

ルートを設定するためのヘルプhttp://stackoverflow.com/questions/11779311/testing-webapi-controller-url-link – foolshat

20

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

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ピーター学長の包括的なブログ記事からコピーされます。

0

WebAPI 1ここでVBを使用して同様の問題が発生します。

私がこのような単純な仕事を得るためにここにハイブリッド応答に管理:

Dim request As HttpRequestMessage = New HttpRequestMessage() 
Return request.CreateResponse(HttpStatusCode.BadRequest, myCustomClassObject, GlobalConfiguration.Configuration) 

は念をで掲示、それは誰にも役立ちます。

0

テストクラスでは、コントローラクラスのインスタンスを作成します。 例えばvar customerController= new CustomerController();

customerController.Request = new HttpRequestMessage(); 
customerController.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration()); 
関連する問題