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?

questionAnswers(1)

yourAnswerToTheQuestion