Nunit: Assert.Throws ne fonctionne pas avec les délégués asynchrones

Créé le 12 janv. 2016  ·  9Commentaires  ·  Source: nunit/nunit

Avec ce cas de test :

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 échoue avec cette exception :

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 passe.

Pourquoi la différence ? Assert.Throws renvoie l'exception pour des tests supplémentaires, ce qui est une fonctionnalité utile que le style Assert.That ne fournit pas.

duplicate

Commentaire le plus utile

Stackoverflow m'a amené ici. Bon travail!! J'ai mis à jour NuGet vers la version 3.20 et j'ai pu utiliser la fonction Assert.ThrowsAsyc !

Tous les 9 commentaires

Merci pour le rapport. J'ai confirmé et attribué cela comme un problème hautement prioritaire. Les deux instances acceptent un TestDelegate, elles doivent donc se comporter de la même manière.

Quant à savoir pourquoi Assert.That ne retourne pas l'exception, c'est parce que nous ne savons pas quelle contrainte vous allez utiliser en fonction de la signature. Il est courant d'écrire des assertions fluides comme Assert.That(async () => await One(), Is.EqualTo(1))); qui est la même méthode que vous appelez.

Il est intéressant de noter que cela ne semble être un problème qu'avec la contrainte de lancers. D'autres contraintes fonctionnent,

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

Tâche asynchrone statiqueRetardéSignificationDeVie()
{
attendre Task.Delay(TimeSpan.FromSeconds(2)).ConfigureAwait(false);
retour 42 ;
}
```

Qu'entendez-vous par un problème avec la contrainte des lancers ? À moins que Assert.Throws utilise en interne, la contrainte throws ( Assert.That(..., Throws...) ) fonctionne. C'est Assert.Throws qui ne fonctionne pas.

Si Assert.That fonctionne pour Throws je m'attendrais à ce que cela fonctionne également pour Is.EqualTo et amis.

Mon erreur, j'ai mal lu quel test échouait et même mal lu lequel de mes tests échouait. Donc mon commentaire sur la contrainte est incorrect. Assert.Throws est l'une des rares assertions classiques qui ne s'enchaîne pas à sa contrainte équivalente.

Corrigé par #1142, mais nous devrons documenter.

Merci.

Je ne vois pas les modifications apportées à #1142, mais le message d'erreur ("les méthodes d'annulation asynchrone ne sont pas prises en charge") reste-t-il ou l'erreur indique-t-elle que le développeur devrait utiliser Assert.ThrowsAsync place ?

@yaakov-h, oui, une fois que nous aurons publié la prochaine version, Assert.ThrowsAsync devrait être utilisé à la place. Pour l'instant, utilisez la syntaxe fluide.

Stackoverflow m'a amené ici. Bon travail!! J'ai mis à jour NuGet vers la version 3.20 et j'ai pu utiliser la fonction Assert.ThrowsAsyc !

Exactement ce que je cherchais. Merci.

Cette page vous a été utile?
0 / 5 - 0 notes