Nunit: Assert.Throws tidak berfungsi dengan delegasi async

Dibuat pada 12 Jan 2016  ·  9Komentar  ·  Sumber: nunit/nunit

Dengan kasus uji ini:

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 gagal dengan pengecualian ini:

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

Mengapa perbedaan? Assert.Throws mengembalikan pengecualian untuk pengujian lebih lanjut, yang merupakan fungsionalitas berguna yang tidak disediakan oleh gaya Assert.That .

duplicate

Komentar yang paling membantu

Stackoverflow membawa saya ke sini. Kerja bagus!! Saya memperbarui NuGet ke versi 3.20 dan dapat menggunakan fungsi Assert.ThrowsAsyc!

Semua 9 komentar

Terima kasih atas laporannya. Saya telah mengkonfirmasi dan menetapkan ini sebagai masalah prioritas tinggi. Kedua instance menggunakan TestDelegate, jadi keduanya harus berperilaku sama.

Adapun mengapa Assert.Itu tidak mengembalikan pengecualian, itu karena kami tidak tahu batasan mana yang akan Anda gunakan berdasarkan tanda tangan. Adalah umum untuk menulis pernyataan yang lancar seperti Assert.That(async () => await One(), Is.EqualTo(1))); yang merupakan metode yang sama dengan yang Anda panggil.

Menariknya, ini tampaknya hanya menjadi masalah dengan batasan lemparan. Kendala lain bekerja,

``` C#
[Tes]
kekosongan publik TestTheMeaningOfLife()
{
Assert.That(async () => menunggu DelayedMeaningOfLife(), Is.EqualTo(42));
}

Tugas asinkron statisMakna Hidup Tertunda()
{
menunggu Task.Delay(TimeSpan.FromSeconds(2)).ConfigureAwait(false);
kembali 42;
}
```

Apa yang Anda maksud dengan masalah dengan batasan lemparan? Kecuali Assert.Throws menggunakannya secara internal, batasan lemparan ( Assert.That(..., Throws...) ) berfungsi. Itu Assert.Throws yang tidak berfungsi.

Jika Assert.That bekerja untuk Throws saya berharap itu juga akan bekerja untuk Is.EqualTo dan teman-teman.

Kesalahan saya, saya salah membaca tes mana yang gagal dan bahkan salah membaca tes mana yang gagal. Jadi komentar saya tentang kendala tidak benar. Assert.Throws adalah salah satu dari sedikit pernyataan klasik yang tidak berantai ke batasan yang setara.

Diperbaiki oleh #1142, tetapi kita perlu mendokumentasikan.

Terima kasih.

Saya tidak dapat melihat dari perubahan ke #1142, tetapi apakah pesan kesalahan ("metode async void tidak didukung") tetap ada, atau apakah kesalahan menunjukkan bahwa pengembang seharusnya menggunakan Assert.ThrowsAsync sebagai gantinya?

@yaakov-h, ya, setelah kami merilis versi berikutnya, Assert.ThrowsAsync harus digunakan sebagai gantinya. Untuk saat ini, gunakan sintaks yang lancar.

Stackoverflow membawa saya ke sini. Kerja bagus!! Saya memperbarui NuGet ke versi 3.20 dan dapat menggunakan fungsi Assert.ThrowsAsyc!

Hanya apa yang saya cari. Terima kasih.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

dgm90 picture dgm90  ·  5Komentar

ericnewton76 picture ericnewton76  ·  3Komentar

xplicit picture xplicit  ·  5Komentar

DustinKingen picture DustinKingen  ·  4Komentar

ChrisMaddock picture ChrisMaddock  ·  3Komentar