2015-09-23 16 views
5

Nie ma łatwego sposobu uzyskania dostępu do obiektu obiektu z testami integracji z AspNet.TestHost.TestServer. Pliki cookie muszą być ustawione przez akcję kontrolera. Jaki jest najlepszy sposób, aby to osiągnąć?Dostęp do plików cookie w ramach testu jednostkowego w kontekście AspNet.TestHost.TestServer na ASP.NET 5/MVC 6

  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"]); 

Rozwiązanie widzę jest rozszerzenie Instancji TestServer powrócić instancji klasy CustomClientHandler : ClientHandler i zastąpić cały proces wysyłania żądania w tym obsługi, ale wymaga to dosłownie zmienić całą logikę wyjątkiem stosunkowo małym kod serwera testowego.

Jakieś lepsze sugestie, jak zaimplementować dostęp do plików cookie w odpowiedzi?

Odpowiedz

6

Pliki cookie są po prostu nagłówkami. Oto przykład wzięcia pliku cookie z odpowiedzi i dodanie go do następnego żądania: https://github.com/aspnet/Mvc/blob/538cd9c19121f8d3171cbfddd5d842cbb756df3e/test/Microsoft.AspNet.Mvc.FunctionalTests/TempDataTest.cs#L201-L202

+1

Link do potencjalnego rozwiązania jest zawsze mile widziany, ale proszę [dodaj kontekst wokół linku] (// meta.stackoverflow.com/a/8259), aby inni użytkownicy mieli pojęcie, co to jest i dlaczego jest tam . ** Zawsze cytuj najważniejszą część ważnego linku, na wypadek, gdyby strona docelowa była nieosiągalna lub została trwale wyłączona. ** Weź pod uwagę, że bycie "stanowiącym coś więcej niż link do strony zewnętrznej" jest możliwym powodem [Dlaczego i w jaki sposób niektóre odpowiedzi zostały usunięte?] (// stackoverflow.com/help/deleted-answers). – kayess

+0

Zapraszam do rozwinięcia odpowiedzi, miałem tylko czas, aby wskazać im właściwy kierunek. Wydaje się, że też pomogło. – Tratcher

0

Zaimplementowałem niestandardowy HttpMessageHandler, który śledzi pliki cookie.

Używa refleksji do wywołania aktualnego programu obsługi i po prostu odczytuje/ustawia nagłówki plików 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; 
    } 
} 

A potem utworzeniu HttpClient tak:

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

TestMessageHandler teraz dba o śledzących plików cookie.