Por que os testes de unidade assíncronos falham quando as palavras-chave async / waitit não são usadas?
De acordo comessa discussão, não deve haver diferença entre os dois métodos a seguir:
public async Task Foo()
{
await DoSomethingAsync();
}
public Task Foo()
{
return DoSomethingAsync();
}
Na verdade, parece que, para métodos muito simples, a invocaçãosem as palavras-chave async / waitit seriam preferidas, pois removeriam alguma sobrecarga.
No entanto, isso aparentemente nem sempre funciona em testes de unidade.
MSTest
[TestClass]
public class AsyncTest
{
[TestMethod]
public async Task Test1()
{
await Task.Delay(0);
}
[TestMethod]
public Task Test2()
{
return Task.Delay(0);
}
}
NUnit
[TestFixture]
public class AsyncTest
{
[Test]
public async Task Test1()
{
await Task.Delay(0);
}
[Test]
public Task Test2()
{
return Task.Delay(0);
}
}
XUnit
public class AsyncTest
{
[Fact]
public async Task Test1()
{
await Task.Delay(0);
}
[Fact]
public Task Test2()
{
return Task.Delay(0);
}
}
Em todos os casos,Test1
passa.No MSTest,Test2
aparece no corredor de teste, mas não é executado.No NUnit,Test2
é ignorado, com a mensagem:
O método de teste possui um tipo de retorno não nulo, mas nenhum resultado é esperado
No XUnit,Test2
passa.
Como as tarefas ainda são aguardáveis em todos os casos, o que há com oasync
palavra-chave que afeta os corredores de teste NUnit e MSTest? Talvez algum problema de reflexão?