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
.
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 statis
{
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.
Komentar yang paling membantu
Stackoverflow membawa saya ke sini. Kerja bagus!! Saya memperbarui NuGet ke versi 3.20 dan dapat menggunakan fungsi Assert.ThrowsAsyc!