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.
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 Aufgabe
{
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.
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!