2016-07-01 12 views
0

私は、クエリ文字列の特定の値をチェックし、クエリ文字列の別の値を更新するowinミドルウェアを持っています。私はMicrosoft.OWin.Testingを使用して、このミドルウェアを呼び出してリクエストを行います。私がリクエストした後、クエリ文字列が正確にどのように変更されたかをどうやって確認するのですか?クエリ文字列を設定するユニットテストのowinミドルウェア

public static void UseInjectQueryString(this IAppBuilder app) 
{   
    app.Use(async (context, next) => 
      { 
       // Some code here 
       if (context.Environment.ContainsKey("owin.RequestQueryString")) 
       { 
         var existingQs = context.Environment["owin.RequestQueryString"]; 
         var parser = new UrlParser(existingQs.ToString()); 
         parser[Constants.AuthorizeRequest.AcrValues] = newAcrValues; 

         context.Environment.Remove("owin.RequestQueryString"); 
         context.Environment["owin.RequestQueryString"] = parser.ToString(); 
        } 
      } 

    await next(); 
}); 

ユニットテスト:

[TestMethod] 
public async Task SomeTest() 
{ 
    using (var server = TestServer.Create(app => 
          {     
           //.... injecting middleware.. 
          })) 
    { 
     HttpResponseMessage response = await server.CreateRequest("core/connect/token?client_id=clientStub").GetAsync(); 
    } 
} 

答えて

1

あなたは、パイプラインの外にそれをテストできるように、私は、ミドルウェアをリファクタリングでしょう。たとえば、あなたはこのようにそれを構造化することができます:

public static class InjectQueryStringMiddleware 
{ 
    public static void InjectQueryString(IOwinContext context) 
    { 
     if (context.Environment.ContainsKey("owin.RequestQueryString")) 
     { 
      var existingQs = context.Environment["owin.RequestQueryString"]; 
      var parser = new UrlParser(existingQs.ToString()); 
      parser[Constants.AuthorizeRequest.AcrValues] = newAcrValues; 

      context.Environment.Remove("owin.RequestQueryString"); 
      context.Environment["owin.RequestQueryString"] = parser.ToString(); 
     } 
    } 

    public static void UseInjectQueryString(this IAppBuilder app) 
    { 
     app.Use(async (context, next) => 
     { 
      // some code here 
      InjectQueryString(context); 
     } 
    } 
} 

今、あなたは全体のパイプラインを作成しなくても、それはコンテキストに正しいことをしないことInjectQueryStringをテストすることができます。

+0

これはいいですね。ここでは、コンテキストを嘲笑してInjectQueryStringメソッドを単体テストし、TestServer.Createメソッドを使ってサーバーのインスタンスとインスタンスを作成しないようにしてください。あれは正しいですか?そうであれば、次のコード行をどのようにカバーすればよいですか? { //ここではいくつかのコード InjectQueryString(コンテキスト); } – Shetty

+0

あなたは '//some code here'は実際にテストする価値のあるものです(そして、同様の方法でそれを持ち上げることができます)。そのコードはとても簡単なので、テストする必要はありません。クエリインジェクションに依存する機能はパイプラインの後半で失敗するため、システムの大部分の統合テスト(手動または自動)で容易に対応できます。 –

関連する問題