2016-09-15 3 views
5

Я совершенно не новичок в использовании асинхронных вызовов и жду. У меня есть ниже функции модульного тестирования:Console.WriteLine после вызова async ждут.

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 заявление печати появляется на выходе - я не знаю, почему. Я оглядывался вокруг, и мне кажется, что мне может потребоваться установить это как задачу? Может ли кто-нибудь указать мне в правильном направлении?

+3

Какие рамки теста вы используете? Micrsoft или NUnit? Возможно, вы захотите изменить тип возврата на «Задача» –

+2

Возможно, вы захотите изменить тип возврата на «Задача» (не void - никогда не использовать void как возвращаемый тип, если вы можете помочь); вы не сможете этого ожидать иначе. Кроме того, поместите HttpClient в блок использования. – 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 и ожидайте метод, который вы вызываете. Кроме того, ваш метод испытания должен быть помечен как async Task, а так как ни MS Test Runner, ни другие инструменты (NCrunch, NUnit) будет правильно работать с асинхронным ничтожной метода испытаний:

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

Я думаю, что самое лучшее, что можно сделать здесь для вас, было бы выбрать тип возврата 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); 
} 
Смежные вопросы