2017-05-19 2 views
0

ich moq bin mit einem Wrapper ich für HttpClient Klasse erstellt verspotten:Richtiger Weg Httpclient zu verspotten und senden/erhalten Cookies

public interface IHttpClientWrapper 
{ 
    Task<HttpResponseMessage> PostAsync(Uri uri, 
             HttpContent content, 
             CookieContainer cookies = null); 
} 

und in meiner „normalen“ Implementierung von PostAsync, ich delegieren nur um den Anruf HttpClient

public Task<HttpResponseMessage> PostAsync(Uri uri, HttpContent content, CookieContainer cookies = null) 
{ 
    var client = cookies == null ? new HttpClient() 
     : new HttpClient(new HttpClientHandler { CookieContainer = cookies }); 

    return client.PostAsync(uri, content); 
} 

Also, in meiner Anwendung, funktioniert alles einwandfrei und ich bekomme den vom Server Cookies (cookies.Count ist nicht 0)

Für meinen Test habe ich eine Mock<IHttpClientWrapper>, und ich habe seine PostAsync Methode eingerichtet, um eine new HttpResponseMessage zurückzugeben. Ich rufe auch HttpResponseMessage.Headers.AddCookies Methode, um 2 Cookies zu dieser Antwort hinzuzufügen.

Aber wenn ich meine verspottet Objekt in einer Weise, wie dies nennen:

/* I setup url and content */ 
var mock = new Mock<IHttpClientHelper>(); 
mock.Setup(/* setup PostAsync to return the response I create */)... 
var cookies = new CookieContainer(); 
var response = await mock.PostAsync(url, content, cookies); 

dann ist cookies.Count immer 0.

Also habe ich mich gefragt, was ist anders als den tatsächlichen Server aufrufen? Muss ich zusätzliche Header haben? Wie kann ich die Cookies hier einstellen?

+1

Dies ist kein [mcve], mit dem das Problem reproduziert werden kann. – Nkosi

Antwort

1

CookieContainer an PostAsync Methode als Parameter übergeben. Die Tatsache, dass PostAsync Cookies zu CookiesContainer hinzufügt, ist ein Nebeneffekt dieses Verfahrens, ein Detail von insbesondereIHttpClientHelper Implementierung. new Mock<IHttpClientHelper> erstellt eine weitere Implementierung, die keine Cookies hinzufügt.

Also, wenn Sie wollen Mock Cookies es in einen Container hinzufügen müssen eine zusätzliche Einrichtung

mock.Setup(_ => _.PostAsync(It.IsAny<Uri>(), It.IsAny<HttpContent>(), It.IsAny<CookieContainer>())) 
    .Callback<Uri, HttpContent, CookieContainer>((u, c, cookieContainer) => 
    { 
     // Add required cookies here 
     cookieContainer.Add(...); 
    }); 

Callback ist ein Verfahren zur Herstellung Mock Setup Nebenwirkungen.

+0

Vielen Dank für Ihre Antwort, ich werde es testen und Sie wissen lassen :) – Farzad

+0

Nur eine Frage, können Sie bitte erklären, warum der 'Callback' hier funktioniert? Ich bin neu in 'Moq', aber wenn ich mir ein paar Tutorials ansehe, würde ich denken, dass' Callback' aufgerufen wird, wenn es einen zweiten Aufruf der Methode gibt. Ist das richtig? – Farzad

Verwandte Themen