2015-09-23 14 views
5

AspNet.TestHost.TestServerで統合テストを実行中のオブジェクトにアクセスする簡単な方法はありません。responseオブジェクトにアクセスする方法はありません。 Cookieは、コ​​ントローラのアクションによって設定する必要があります。それを達成する最善の方法は何ですか?私が見ASP.NET 5/MVC 6のAspNet.TestHost.TestServerコンテキストのユニットテスト内のCookieにアクセス

  var client = TestServer.Create(app => 
      { 
       app.UseMvc(routes => 
         routes.MapRoute("default", "{controller}/{action}/{id?}")); 
       app.UseIdentity(); 
      }).CreateClient(); 

      var request = new HttpRequestMessage(HttpMethod.Get, "account/login"); 
      var response = await client.SendAsync(request); 

      // how to get an access to cookie container ????????? 
      // response.Cookies prop doesn't exist 
      Assert.NotEmpty(response.Cookies["auth"]); 

ソリューションは、TESTSERVERのインスタンスを拡張するクラスCustomClientHandler : ClientHandlerのインスタンスを返し、そのハンドラでリクエストを送信するプロセス全体をオーバーライドすることであるが、それは、比較的小さなコードを除くすべてのロジックを変更するには、文字通り必要がありますTestServerの

回答でCookieへのアクセスを実装する方法を教えてください。

答えて

6

クッキーは単なるヘッダーです。レスポンスからクッキーを取り出して次のリクエストに追加する例を次に示します。https://github.com/aspnet/Mvc/blob/538cd9c19121f8d3171cbfddd5d842cbb756df3e/test/Microsoft.AspNet.Mvc.FunctionalTests/TempDataTest.cs#L201-L202

+1

潜在的な解決策へのリンクは常に歓迎しますが、[リンクの前後にコンテキストを追加する](// meta.stackoverflow.com/a/8259)ので、仲間のユーザーは、それが何であるか、それがなぜ。 **ターゲットサイトが到達不能であるか、または永続的にオフラインになる場合に、重要なリンクの最も関連性の高い部分を常に引用します。**外部サイトへのリンク以上であることを考慮すると、[理由と理由いくつかの回答はどのように削除されますか?](// stackoverflow.com/help/deleted-answers) – kayess

+0

答えを自由に展開しても、私は正しい方向に向けるだけの時間がありました。あまりにも助けになったようだ。 – Tratcher

0

Cookieを追跡するカスタムHttpMessageHandlerを実装しました。

実際のハンドラを呼び出すためにリフレクションを使用し、Cookieヘッダーを読み取り/設定するだけです。

class TestMessageHandler : HttpMessageHandler 
{ 
    delegate Task<HttpResponseMessage> HandlerSendAsync(HttpRequestMessage message, CancellationToken token); 

    private readonly HandlerSendAsync nextDelegate; 
    private readonly CookieContainer cookies = new System.Net.CookieContainer(); 

    public TestMessageHandler(HttpMessageHandler next) 
    { 
     if(next == null) throw new ArgumentNullException(nameof(next)); 

     nextDelegate = (HandlerSendAsync) 
          next.GetType() 
           .GetTypeInfo() 
           .GetMethod("SendAsync", BindingFlags.NonPublic | BindingFlags.Instance) 
           .CreateDelegate(typeof(HandlerSendAsync), next); 
    } 

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     request.Headers.Add("Cookie", cookies.GetCookieHeader(request.RequestUri)); 

     var resp = await nextDelegate(request, cancellationToken).ConfigureAwait(false); 

     if (resp.Headers.TryGetValues("Set-Cookie", out var newCookies)) 
     { 
      foreach (var item in SetCookieHeaderValue.ParseList(newCookies.ToList())) 
      { 
       cookies.Add(request.RequestUri, new Cookie(item.Name, item.Value, item.Path)); 
      } 
     } 

     return resp; 
    } 
} 

そして、あなたはこのようなあなたのHttpClientを作成します。

var httpClient = new HttpClient(
        new TestMessageHandler(
         server.CreateHandler())); 

TestMessageHandlerは今クッキーを追跡するの面倒を見ます。

関連する問題