2016-09-15 5 views
5

Ich bin völlig neu in der Verwendung von Async-Anrufen und erwarten. Ich habe die unten Funktionseinheit Test:Console.WriteLine nach Async warten auf Anruf.

public async static void POSTDataHttpContent(string jsonString, string webAddress) 
    { 
     HttpClient client = new HttpClient(); 
     StringContent stringContent = new StringContent(jsonString); 
     HttpResponseMessage response = await client.PostAsync(
      webAddress, 
      stringContent); 

     Console.WriteLine("response is: " + response); 
    } 

Der Test ohne Fehler beendet, aber ich habe nie in der Ausgabe erscheint die Console.WriteLine print-Anweisung sehen - ich bin mir nicht sicher, warum. Ich habe mich umgesehen und es hört sich so an, als müsste ich das als Aufgabe aufstellen? Könnte mir jemand in die richtige Richtung zeigen?

+3

Welche Test-Framework Sie verwenden? Micrsoft's eigene oder NUnit? Möglicherweise möchten Sie den Rückgabetyp zu "Task" ändern –

+2

Sie möchten wahrscheinlich den Rückgabetyp zu Task ändern (nicht void - nie void als Rückgabetyp verwenden, wenn Sie es helfen können); Sie werden es sonst nicht erwarten können. Fügen Sie auch HttpClient in einen using-Block ein. – EJoshuaS

+2

Ich verwende Microsoft's. – Roka545

Antwort

3

Da Sie bereits ein HttpResponseMessage erwartet, eine einfache (und konsistent) Lösung ist, zurückgeben Task<HttpResponseMessage>.

var x = await POSTDataHttpContent("test", "http://api/"); 

public async Task<HttpResponseMessage> POSTDataHttpContent(
    string jsonString, string webAddress) 
{ 
    using (HttpClient client = new HttpClient()) 
    { 
     StringContent stringContent = new StringContent(jsonString); 
     HttpResponseMessage response = await client.PostAsync(
     webAddress, 
     stringContent); 

     Console.WriteLine("response is: " + response); 

     return response; 
    } 
} 

Das heißt, Sie müssen auch sicherstellen, dass Ihre Testkonfiguration korrekt ist. Sie können eine asynchrone Methode aus einem synchronen Test nicht ordnungsgemäß aufrufen. Markieren Sie stattdessen Ihren Test async und warten Sie auf die Methode, die Sie anrufen. Außerdem muss die Testmethode als async Task markiert wird auch da weder MS Test Runner noch andere Werkzeuge (NCrunch, NUnit) ordnungsgemäß mit einer Asynchron Leeren Testmethode beschäftigen:

[TestMethod] 
public async Task TestAsyncHttpCall() 
{ 
    var x = await POSTDataHttpContent("test", "http://api/"); 
    Assert.IsTrue(x.IsSuccessStatusCode); 
} 
1

Ich denke, das beste, was Sie hier für Sie tun würden, wäre, sich für einen Task Rückgabetyp anstelle einer Lücke zu entscheiden.

public async Task POSTDataHttpContent(string jsonString, string webAddress) 
{ 
    using (HttpClient client = new HttpClient()) 
    { 
     StringContent stringContent = new StringContent(jsonString); 
     HttpResponseMessage response = await client.PostAsync(
      webAddress, 
      stringContent); 

     // Assert your response may be? 
    }   
} 

Und wenn Sie wirklich unnachgiebig nicht Aufgaben verwenden (was keine gute Idee ist):

public void POSTDataHttpContent(string jsonString, string webAddress) 
{ 
    var Task = Task<HttpResponseMessage>.Run(async() => { 
     using (HttpClient client = new HttpClient()) 
     { 
      StringContent stringContent = new StringContent(jsonString); 
      HttpResponseMessage response = await client.PostAsync(
       webAddress, 
       stringContent); 


      return response; 
     } 
    }); 

    Task.Wait(); 
    Assert.IsNotNull(Task.Result); 
}