2015-09-23 15 views
5

पर AspNet.TestHost.TestServer संदर्भ में यूनिट परीक्षण के अंदर कुकीज़ एक्सेस करें में CookieContainer तक पहुंच प्राप्त करने का कोई आसान तरीका नहीं है AspNet.TestHost.TestServer के साथ ऑब्जेक्ट रनिंग एकीकरण परीक्षण। कुकीज़ को नियंत्रक कार्रवाई द्वारा सेट किया जाना है। इसे प्राप्त करने का सबसे अच्छा तरीका क्या है?एएसपी.NET 5/एमवीसी 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"]); 

समाधान है कि मैं देख रहा हूँ TestServer के कहने का विस्तार, एक वर्ग CustomClientHandler : ClientHandler के कहने लौट सकते हैं और है कि हैंडलर में एक अनुरोध भेजने की पूरी प्रक्रिया को ओवरराइड करने के लिए है, लेकिन यह सचमुच जरूरत है अपेक्षाकृत छोटे कोड को छोड़कर सभी तर्क को बदलने के लिए टेस्टसेवर का।

कोई बेहतर सुझाव कि प्रतिक्रिया में कुकीज तक पहुंच को कैसे कार्यान्वित किया जाए?

उत्तर

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

मैंने कस्टम HttpMessageHandler को लागू किया है जो कुकीज को ट्रैक करता है।

यह वास्तविक हैंडलर को आमंत्रित करने के लिए प्रतिबिंब का उपयोग करता है और केवल कुकी हेडर को पढ़ता/सेट करता है।

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 अब कुकीज़ पर नज़र रखने का ख्याल रखता है।