2016-12-30 21 views
20

私はコントローラで、私がHTTPリクエストのヘッダーに値を期待する単体テストという機能を持っています。 HttpContextは読み取り専用なので初期化できません。.NETコアのMVCコントローラをユニットテストするための模擬HttpContext?

私のコントローラ機能は、「デバイスID」

[TestMethod] 
public void TestValuesController() 
{ 
    ValuesController controller = new ValuesController(); 

    //not valid controller.HttpContext is readonly 
    //controller.HttpContext = new DefaultHttpContext(); 

    var result = controller.Get(); 
    Assert.AreEqual(result.Count(), 2); 
} 

サードパーティのライブラリを使用せずにこれを行うにはストレートな方法はあるのHTTPリクエストヘッダの値を期待しますか?

+0

* HttpContextを使用しないでください。コントローラを使用することの全ポイントは、データがコントローラのパラメータを通って来ることです。コントローラがHttpContextを使用してWebFormsページのようにデータを読み取ると、問題が発生します。 –

+0

@PanagiotisKanavosヘッダーの値は、コールがどのモバイルデバイスから送信されたかを示す情報です。これは、正しいデータを検索するために必要なことです。カスタムアクションフィルタによって処理される認証にIDが必要なため、デバイスIDはヘッダーに含まれています。デバイスIDをルートパラメータとして渡すこともできますが、冗長になります –

+0

FromHeaderAttributeをチェックするだけでなく、重複をチェックしてください。 HttpContextは今設定から注入可能です –

答えて

56

が、私はこの方法でのHttpContextとヘッダを初期化することができました:

[TestMethod] 
public void TestValuesController() 
{ 
    ValuesController controller = new ValuesController(); 
    controller.ControllerContext = new ControllerContext(); 
    controller.ControllerContext.HttpContext = new DefaultHttpContext(); 
    controller.ControllerContext.HttpContext.Request.Headers["device-id"] = "20317"; 
    var result = controller.Get(); 
    //the controller correctly recieves the http header key value pair device-id:20317 
    ... 
} 
5

むしろのHttpContextをからかっよりも、おそらく、メソッドのパラメータにヘッダーをマップするには良いアイデアです。例えば、この答えの下部にコントローラに、idパラメータは、「デバイスID」と同じ名前の値のヘッダに設定されている...ユニットテストは、次になる

[TestMethod] 
public void TestValuesController() 
{ 
    ValuesController controller = new ValuesController(); 
    var result = controller.GetHeaderValue("27"); 
    Assert.AreEqual(result, "27"); 
} 

もし一方 HttpContextを模擬することができます。私の意見では、選択肢がなければ、避けるべきことです。 FromHeaderAttributeのドキュメントはFromHeaderAttribute Classにあります。

public class ValuesController: Controller 
    { 

     public string GetHeaderValue([FromHeader(Name = "device-id")] string id) 
     { 
     return id; 
     } 
    } 
+0

私の場合は、IIRC、それは同じ値を評価する必要があったので、 .netコアミドルウェアコンポーネント –

関連する問題