2016-09-15 9 views
5

私は非同期呼び出しを使用することに全く新しいです。を待っています。私は以下のユニットテスト機能を持っている:Console.WriteLineは、非同期待ちの呼び出しの後です。

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); 
    } 

テストがエラーなしで完了しますが、私はConsole.WriteLineを print文は出力に表示さ見ることはありません - 私はなぜわかりません。私は周りを見回してきましたが、これをタスクとして設定する必要があるように聞こえますか?誰かが私を正しい方向に向けることができますか?

+3

使用しているテストフレームワーク:さらに、あなたの試験方法は、MSのテストランナーや他のツール(NCrunch、NUnitの)どちらが適切に非同期ボイド試験方法を扱いますので、同様async Taskとしてマークする必要がありますか? Micrsoft自身またはNUnit?戻り値の型を 'Task'に変更したいかもしれません –

+2

戻り値の型をTaskに変更したいと思うかもしれません。そうでなければそれを待つことはできません。また、HttpClientをusingブロックに配置します。 – EJoshuaS

+2

私はMicrosoftのものを使用しています。 – Roka545

答えて

3

すでにHttpResponseMessageを待っているので、簡単な(かつ一貫性のある)ソリューションがにあります返信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; 
    } 
} 

つまり、テスト設定が正しいことを確認する必要があります。同期テストから非同期メソッドを正しく呼び出すことはできません。代わりに、あなたのテストasyncもマークし、呼び出しているメソッドを待ちます。

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

あなたのためにここでやるべきことは、voidの代わりにTaskの戻り値型を選択することです。

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? 
    }   
} 

そして、あなたは(良いアイデアではありません)タスクを使用しないことについて、本当に断固している場合:

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); 
} 
関連する問題