2013-10-11 2 views
65

async void модульные тесты не могут быть запущены в Visual Studio 2012:Почему не удается распознать единичные тесты «асинхронные»?

[TestClass] 
public class MyTestClass 
{ 
    [TestMethod] 
    public async void InvisibleMyTestMethod() 
    { 
     await Task.Delay(1000); 
     Assert.IsTrue(true); 
    } 
} 

Если я хочу, чтобы пройти тест на асинхронный блок, метод испытания должен возвращать задачи:

[TestMethod] 
public async Task VisibleMyTestMethod() 
{ 
    await Task.Delay(1000); 
    Assert.IsTrue(true); 
} 

Почему это так ? Не то, чтобы я абсолютно нуждался в методе тестирования async void, мне просто интересно. Visual Studio 2012 не дает никаких предупреждений и ошибок при создании метода тестирования async void, даже если он не сможет быть запущен ...

ответ

65

async void методы следует рассматривать как «Огонь и забыть» - нет способа дождитесь их завершения. Если Visual Studio должен был запустить один из этих тестов, он не смог бы дождаться завершения теста (отметьте его как успешный) или поймайте все поднятые исключения.

С помощью async Task вызывающий абонент может дождаться завершения выполнения и уловить любые исключения, возникающие во время его запуска.

См. this answer для более подробного обсуждения async void vs async Task.

+3

Это неправда. NUnit поддерживает тесты «async void» и как и почему их поддержка подробно описана в этой [ссылке] (http://simoneb.github.io/blog/2013/01/19/async-support-in- NUnit /). См. [Ответ] (http://stackoverflow.com/a/19319749/285199) ниже. – Anupam

21

Это просто потому, что MSTest не поддерживает async void модульных тестов. Это можно сделать , введя контекст, в котором они могут выполняться.

MSTest не поддерживает это, возможно, потому, что Microsoft решила, что это слишком большая часть изменений для существующих тестов (возможно, что существующие тесты были бы тупиковыми, если бы им был предоставлен неожиданный контекст).

Нет предупреждений/ошибок компилятора, потому что это совершенно правильный код C#. Единственная причина, по которой это не работает, - это из-за модульной тестовой среды (т. Е. Я считаю, что xUnit действительно поддерживает тесты async void), и это было бы грубым нарушением разделения проблем для компилятора C# для просмотра ваших атрибутов, определения вы используете MSTest и решаете, что вы действительно не хотели использовать async void.

+1

В первой реализации (предварительный просмотр Visual Studio) тест будет переработан и «запущен». Проблема заключалась в том, что метод завершился бы на первом ожидании, и это было результатом теста. –

16

Я нашел в VS2015, что любые методы тестирования, украшенные асинхронизмом, не будут отображаться в Test Explorer. Я закончил удаление ключевого слова async и заменил вызов ожидания в тесте на task.Wait() и выполнил мои афертации на task.Result.

Кажется, что работает нормально. Я еще не пробовал его с исключением.

var task = TheMethodIWantToTestAsync(someValue); 
task.Wait(); 
var response = task.Result; 

Assert.IsNotNull(response); 
Assert.IsTrue(response.somevalue); 
+3

Не думайте, что нужно вызвать task.Wait() как вызов task.Result вызовет task.Wait() автоматически, если задача еще не закончена. – stt106

+2

Правильно, вам не нужно называть Wait(). – Adrian

Смежные вопросы