Nunit: Assert.Throws не работает с асинхронными делегатами

Созданный на 12 янв. 2016  ·  9Комментарии  ·  Источник: nunit/nunit

В этом тестовом примере:

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 не предоставляет.

duplicate

Самый полезный комментарий

Stackoverflow привел меня сюда. Отличная работа!! Я обновился в NuGet до версии 3.20 и смог использовать функцию Assert.ThrowsAsyc!

Все 9 Комментарий

Спасибо за отчет. Я подтвердил и присвоил этому вопросу высокий приоритет. Оба экземпляра принимают TestDelegate, поэтому должны вести себя одинаково.

Что касается того, почему Assert.That не возвращает исключение, это потому, что мы не знаем, какое ограничение вы собираетесь использовать на основе подписи. Часто пишут беглые утверждения, такие как Assert.That(async () => await One(), Is.EqualTo(1))); что является тем же методом, который вы вызываете.

Интересно, что это, похоже, проблема только с ограничением бросков. Другие ограничения работают,

`` С #
[Тестовое задание]
public void TestTheMeaningOfLife ()
{
Assert.That (async () => ждать DelayedMeaningOfLife (), Is.EqualTo (42));
}

статическая асинхронная задачаDelayedMeaningOfLife ()
{
ждать 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!

Именно то, что я искал. Спасибо.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги