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.
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ática
{
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.
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!