Nunit: Assert.Throws funktioniert nicht mit asynchronen Delegaten

Erstellt am 12. Jan. 2016  ·  9Kommentare  ·  Quelle: nunit/nunit

Mit diesem Testfall:

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 schlägt mit dieser Ausnahme fehl:

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 Pässe.

Warum der Unterschied? Assert.Throws gibt die Ausnahme für weitere Tests zurück, eine nützliche Funktionalität, die der Stil Assert.That nicht bietet.

duplicate

Hilfreichster Kommentar

Stackoverflow hat mich hierher gebracht. Gute Arbeit!! Ich habe in NuGet auf die Version 3.20 aktualisiert und konnte die Assert.ThrowsAsyc-Funktion verwenden!

Alle 9 Kommentare

Danke für den Bericht. Ich habe dies bestätigt und als Problem mit hoher Priorität zugewiesen. Beide Instanzen benötigen einen TestDelegate, daher sollten sie sich gleich verhalten.

Der Grund, warum Assert.That die Ausnahme nicht zurückgibt, liegt daran, dass wir nicht wissen, welche Einschränkung Sie basierend auf der Signatur verwenden werden. Es ist üblich, flüssige Asserts wie Assert.That(async () => await One(), Is.EqualTo(1))); zu schreiben, was dieselbe Methode ist, die Sie aufrufen.

Interessanterweise scheint dies nur ein Problem mit der Wurfbeschränkung zu sein. Andere Einschränkungen funktionieren,

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

statische asynchrone AufgabeVerzögerte Bedeutung des Lebens()
{
wait Task.Delay(TimeSpan.FromSeconds(2)).ConfigureAwait(false);
Rückkehr 42;
}
```

Was meinst du mit einem Problem mit der Wurfbeschränkung? Sofern Assert.Throws intern verwendet, funktioniert die throws-Einschränkung ( Assert.That(..., Throws...) ). Es ist Assert.Throws , das nicht funktioniert.

Wenn Assert.That für Throws funktioniert, würde ich erwarten, dass es auch für Is.EqualTo und Freunde funktioniert.

Mein Fehler, ich habe falsch gelesen, welcher Test fehlgeschlagen ist, und sogar falsch gelesen, welcher meiner Tests fehlgeschlagen ist. Daher ist mein Kommentar zur Einschränkung falsch. Assert.Throws ist eine der wenigen klassischen Asserts, die sich nicht an die entsprechende Einschränkung verkettet.

Behoben durch Nr. 1142, aber wir müssen dokumentieren.

Vielen Dank.

Ich kann die Änderungen an #1142 nicht erkennen, aber bleibt die Fehlermeldung ("async-void-Methoden werden nicht unterstützt") bestehen, oder weist der Fehler darauf hin, dass der Entwickler stattdessen Assert.ThrowsAsync verwenden sollte?

@yaakov-h, ja, sobald wir die nächste Version veröffentlichen, sollte stattdessen Assert.ThrowsAsync verwendet werden. Verwenden Sie vorerst die fließende Syntax.

Stackoverflow hat mich hierher gebracht. Gute Arbeit!! Ich habe in NuGet auf die Version 3.20 aktualisiert und konnte die Assert.ThrowsAsyc-Funktion verwenden!

Genau das, was ich gesucht habe. Vielen Dank.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen