В этом тестовом примере:
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
не работает с этим исключением:
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
проходит.
В чем разница? Assert.Throws
возвращает исключение для дальнейшего тестирования, что является полезной функциональностью, которую стиль Assert.That
не предоставляет.
Спасибо за отчет. Я подтвердил и присвоил этому вопросу высокий приоритет. Оба экземпляра принимают TestDelegate, поэтому должны вести себя одинаково.
Что касается того, почему Assert.That не возвращает исключение, это потому, что мы не знаем, какое ограничение вы собираетесь использовать на основе подписи. Часто пишут беглые утверждения, такие как Assert.That(async () => await One(), Is.EqualTo(1)));
что является тем же методом, который вы вызываете.
Интересно, что это, похоже, проблема только с ограничением бросков. Другие ограничения работают,
`` С #
[Тестовое задание]
public void TestTheMeaningOfLife ()
{
Assert.That (async () => ждать DelayedMeaningOfLife (), Is.EqualTo (42));
}
статическая асинхронная задача
{
ждать Task.Delay (TimeSpan.FromSeconds (2)). ConfigureAwait (false);
return 42;
}
`` ''
Что вы имеете в виду под проблемой с ограничением бросков? Если Assert.Throws
использует это внутренне, ограничение throws ( Assert.That(..., Throws...)
) работает. Не работает Assert.Throws
.
Если Assert.That
работает для Throws
я бы ожидал, что он также будет работать для Is.EqualTo
и друзей.
Моя ошибка, я неправильно понял, какой тест не удался, и даже неправильно понял, какой из моих тестов не прошел. Итак, мой комментарий об ограничении неверен. Assert.Throws - одно из немногих классических утверждений, которое не привязано к его эквивалентному ограничению.
Исправлено # 1142, но нам нужно будет задокументировать.
Спасибо.
Я не вижу изменений в # 1142, но остается ли сообщение об ошибке («методы async void не поддерживаются») или ошибка указывает на то, что разработчик должен использовать вместо этого Assert.ThrowsAsync
?
@ yaakov-h, да, как только мы выпустим следующую версию, вместо нее следует использовать Assert.ThrowsAsync. А пока используйте свободный синтаксис.
Stackoverflow привел меня сюда. Отличная работа!! Я обновился в NuGet до версии 3.20 и смог использовать функцию Assert.ThrowsAsyc!
Именно то, что я искал. Спасибо.
Самый полезный комментарий
Stackoverflow привел меня сюда. Отличная работа!! Я обновился в NuGet до версии 3.20 и смог использовать функцию Assert.ThrowsAsyc!