Nunit: Assert.Throws não funciona com delegados assíncronos

Criado em 12 jan. 2016  ·  9Comentários  ·  Fonte: nunit/nunit

Com este caso de teste:

using System;
using System.Threading.Tasks;
using NUnit.Framework;

namespace NUnitAsync
{
    [TestFixture]
    public class Class1
    {
        [Test]
        public void MyAsyncThingTest()
        {
            var ioe = Assert.Throws<InvalidOperationException>(async () => await DelayedFailureAsync());
            Assert.That(ioe.Message, Is.EqualTo("ABC"));
        }

        [Test]
        public void MyAsyncThingFluentTest()
        {
            Assert.That(async () => await DelayedFailureAsync(), Throws.Exception.TypeOf<InvalidOperationException>().And.Message.EqualTo("ABC"));
        }

        static async Task DelayedFailureAsync()
        {
            await Task.Delay(TimeSpan.FromSeconds(2)).ConfigureAwait(false);
            throw new InvalidOperationException("ABC");
        }
    }
}

: negative_squared_cross_mark: MyAsyncThingTest falha com esta exceção:

Test Name:  MyAsyncThingTest
Test FullName:  NUnitAsync.Class1.MyAsyncThingTest
Test Source:    C:\Temp\NUnitAsync\NUnitAsync\Class1.cs : line 15
Test Outcome:   Failed
Test Duration:  0:00:00.004

Result StackTrace:  
at NUnit.Framework.Internal.AsyncInvocationRegion.Create(MethodInfo method)
   at NUnit.Framework.Assert.Throws(IResolveConstraint expression, TestDelegate code, String message, Object[] args)
   at NUnit.Framework.Assert.Throws[TActual](TestDelegate code, String message, Object[] args)
   at NUnit.Framework.Assert.Throws[TActual](TestDelegate code)
   at NUnitAsync.Class1.MyAsyncThingTest() in C:\Temp\NUnitAsync\NUnitAsync\Class1.cs:line 16
Result Message: System.ArgumentException : 'async void' methods are not supported, please use 'async Task' instead

: white_check_mark: MyAsyncThingFluentTest passes.

Por que a diferença? Assert.Throws retorna a exceção para testes adicionais, que é uma funcionalidade útil que o estilo Assert.That não fornece.

duplicate

Comentários muito úteis

Stackoverflow me trouxe aqui. Ótimo trabalho!! Atualizei no NuGet para a versão 3.20 e poderia usar a função Assert.ThrowsAsyc!

Todos 9 comentários

Obrigado pelo relatório. Eu confirmei e atribuí isso como um problema de alta prioridade. Ambas as instâncias recebem um TestDelegate, portanto, devem se comportar da mesma forma.

Quanto ao porquê Assert.That não retorna a exceção, é porque não sabemos qual restrição você usará com base na assinatura. É comum escrever declarações fluentes como Assert.That(async () => await One(), Is.EqualTo(1))); que é o mesmo método que você está chamando.

Curiosamente, isso parece ser apenas um problema com a restrição de lances. Outras restrições funcionam,

`` `C #
[Teste]
public void TestTheMeaningOfLife ()
{
Assert.That (async () => await DelayedMeaningOfLife (), Is.EqualTo (42));
}

Tarefa assíncrona estáticaDelayedMeaningOfLife ()
{
esperar Task.Delay (TimeSpan.FromSeconds (2)). ConfigureAwait (false);
return 42;
}
`` `

O que você quer dizer com um problema com a restrição de lançamento? A menos que Assert.Throws use isso internamente, a restrição de lançamento ( Assert.That(..., Throws...) ) funciona. É Assert.Throws que não está funcionando.

Se Assert.That funcionar para Throws , seria de esperar que funcionasse também para Is.EqualTo e amigos.

Erro meu, eu interpretei mal qual teste estava falhando e até mesmo interpretei mal qual dos meus testes estava falhando. Portanto, meu comentário sobre a restrição está incorreto. Assert.Throws é uma das poucas afirmações clássicas que não se encadeia com sua restrição equivalente.

Corrigido por # 1142, mas precisaremos documentar.

Obrigado.

Não consigo ver nas alterações de # 1142, mas a mensagem de erro ("métodos nulos assíncronos não são suportados") permanece ou o erro indica que o desenvolvedor deve usar Assert.ThrowsAsync vez disso?

@ yaakov-h, sim, assim que lançarmos a próxima versão, Assert.ThrowsAsync deve ser usado. Por enquanto, use a sintaxe fluente.

Stackoverflow me trouxe aqui. Ótimo trabalho!! Atualizei no NuGet para a versão 3.20 e poderia usar a função Assert.ThrowsAsyc!

É mesmo o que eu procurava. Obrigado.

Esta página foi útil?
0 / 5 - 0 avaliações