Nunit: Assert.Throws لا يعمل مع المفوضين غير المتزامنين

تم إنشاؤها على ١٢ يناير ٢٠١٦  ·  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 ، فهذا لا يعيد الاستثناء ، فذلك لأننا لا نعرف القيد الذي ستستخدمه بناءً على التوقيع. من الشائع كتابة تأكيدات بطلاقة مثل Assert.That(async () => await One(), Is.EqualTo(1))); وهي نفس الطريقة التي تتصل بها.

ومن المثير للاهتمام ، أن هذا يبدو أنه مشكلة فقط في قيود الرميات. تعمل قيود أخرى ،

ج #
[اختبار]
اختبار الفراغ العام
{
أكد. That (async () => wait DelayedMeaningOfLife ()، Is.EqualTo (42)) ؛
}

مهمة ثابتة غير متزامنةDelayedMeaningOfLife ()
{
في انتظار Task.Delay (TimeSpan.FromSeconds (2)). ConfigureAwait (false) ؛
العودة 42
}
""

ماذا تقصد بمشكلة رميات القيد؟ ما لم يستخدم Assert.Throws ذلك داخليًا ، فإن قيد الرميات ( Assert.That(..., Throws...) ) يعمل. إنه Assert.Throws الذي لا يعمل.

إذا كان Assert.That يعمل مقابل Throws أتوقع أنه سيعمل أيضًا مقابل Is.EqualTo والأصدقاء.

خطأي ، لقد أخطأت في قراءة أي اختبار كان فاشلاً وحتى أنني أخطأت في قراءة أي من اختباراتي كان فاشلاً. لذا فإن تعليقي حول القيد غير صحيح. Assert. تُعد الدرجات واحدة من التأكيدات الكلاسيكية القليلة التي لا ترتبط بالقيد المكافئ لها.

تم الإصلاح بواسطة # 1142 ، لكننا سنحتاج إلى التوثيق.

شكرا.

لا أستطيع أن أرى من التغييرات التي تم إجراؤها على # 1142 ، ولكن هل تظل رسالة الخطأ ("الأساليب الخالية غير المتزامنة غير مدعومة") ، أم أن الخطأ يشير إلى أن المطور يجب أن يستخدم Assert.ThrowsAsync بدلاً من ذلك؟

@ yaakov-h ، نعم ، بمجرد إصدار الإصدار التالي ، يجب استخدام Assert.ThrowsAsync بدلاً من ذلك. في الوقت الحالي ، استخدم بناء الجملة بطلاقة.

جلبني Stackoverflow إلى هنا. عمل عظيم!! لقد قمت بالتحديث في NuGet إلى الإصدار 3.20 ويمكنني استخدام وظيفة Assert.ThrowsAsyc!

فقط ما كنت أبحث عنه. شكرا.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات