سؤال

لقد استخدمنا Nunit & VisualStudio لكتابة رمز C# .NET لفترة من الوقت الآن. تم إجراء استثناءات الاختبار بأسلوب

بناء الجملة القديم:

[Test]
[ExpectException(typeof(ExceptionType))] 
public void TestExceptionType()
{

}

الآن أصدرت Nunit الإصدار 2.5.2 الذي قدم Assert.Throws( Type expectedExceptionType, TestDelegate code ); هذا يجعل استثناء اختبار أكثر مرونة. تبدو اختبارات استثناءنا الآن مثل هذا:

بناء جملة جديد:

[Test]
public void TestWithNullBufferArgument()
{
   ArgumentNullException ex = Assert.Throws<ArgumentNullException>(() => _testInstance.TestFunction(null));

   // now you can examine the exception and it's properties
   Assert.AreEqual(ex.Message, "Argument was null");
}

مشكلتنا هي أنه إذا تم استخدام Assert.Throws Visual Studio ، فسيقوم Visual Studio بالسعال على نافذة تُظهر استثناءًا غير معقول عند استخدام Nunit (إما وحدة التحكم أو عداء واجهة المستخدم الرسومية) لتصحيح البرنامج.

لتوضيح هذا: لقد قمنا بتعيين مشروع VS الذي يحتوي على اختبارات الوحدة لتشغيل nunit-x86.exe عند تصحيح الأخطاء. (انظر خصائص المشروع ، علامة التبويب تصحيح الأخطاء ، تم تعيين إجراء بدء تشغيل nunit-x86.exe)

هذا يوقف NUNIT من مواصلة الاختبارات. من الممكن الاستمرار في اختبار تصحيح الأخطاء/الوحدة عن طريق الضغط على F5 ولكن هذا ليس حلاً قابلًا للتطبيق.

هل هناك أي طريقة لتجنب هذا؟ محاولة محاولة ... catch block حول التأكيد.

آمل أن يتمكن شخص ما من إلقاء بعض الضوء على هذا.

هل كانت مفيدة؟

المحلول

تظهر المشكلة نفسها لأنه على الأرجح أن لديك خيار تمكين فقط رمز بلدي تشغيل (أدوات-> خيارات-> تصحيح الأخطاء-> عام> تمكين فقط الكود الخاص بي).

"عندما يتم تمكين هذه الميزة ، يتم عرض تصحيح الأخطاء وخطواته في رمز المستخدم (" رمزتي "فقط ، وتجاهل رمز النظام والرمز الآخر المحسّن أو لا يحتوي على رموز تصحيح الأخطاء" (انظر "(انظر" (انظر "(انظر" (انظر "(انظر" (انظر "(انظر" (انظر "مربع الحوار العام ، تصحيح الأخطاء ، خيارات")

عادةً ما يكون لديك إصدار إصدار من nunit.framework.dll الذي لا يحتوي على ملف nunit.framework.pdb المقابل.

لذلك هناك خياران:

  1. قم بتعطيل ميزة "Just Code"

  2. قم بتنزيل مصادر Nunit (من http://www.nunit.org/index.php؟p=download) ، قم بإنشائها في وضع التصحيح ، وضع جميع nunit.framework.* (DLL ، PDB ، XML) في LIB أو دليل آخر في الحل الخاص بك والمرجع أن nunit.framework.dll في مشروع الاختبار الخاص بك.

أتمنى أن يساعدك هذا.

نصائح أخرى

نفس المشكلة أزعجتني لبعض الوقت ، لقد أجريت بعض الاختبارات ووجدت ما يلي:

إذا تم تجميع مكتبة (NUNIT في هذه الحالة) باستخدام معلومات التصحيح إلى "لا شيء" ، فإذا تم تنفيذ بنية مماثلة لتلك أدناه ، فسيتم تنفيذ المكتبة ورمز المفوض على استثناء ، ثم يتوقف مقابل الاستثناء الذي لم يتم التعامل معه من قبل المستخدم الشفرة.

رمز المكتبة:

public static Exception Throws(TestDelegate code, string message)
{
    Exception caughtException = null;

    try
    {
        code();
    }
    catch (Exception ex)
    {
        caughtException = ex;
    }        

    return caughtException;
}

رمز العميل:

private void btnTest_Click(object sender, EventArgs e)
{
  var ex = MyAssert.Throws(() => { throw new Exception(); }, "");    
}

تحديد معلومات التصحيح لمشروع المكتبة إلى أي خيار آخر غير "لا شيء" يحل المشكلة ، أي لم يعد تصحيح الأخطاء لا يتوقف بعد الآن عن استثناءات "غير معطلة" كيندا. لقد اختبرته مع Nunit ومكتبتي التي يتم لفها يدويًا مع الكود أعلاه (أخذت مقتطفًا من طريقة رميات Nunit). أفترض أنها ميزة أو "ميزة" VS.

إنه يتركنا مع العديد من الخيارات:

  1. استثناء التصفية كما هو مقترح سابقًا

  2. إعادة ترجمة nunit.framework.dll للاستخدام المحلي ، لتجنب تلك المحطات المزعجة

يمكن أن تكون الخيارات الأخرى هي الاتصال إما بفرق MS أو NUNIT أو كليهما واطلب منهم التحقيق/توضيح المشكلة وتجميع NUNIT مع الحد الأدنى من معلومات تصحيح الأخطاء.

تعديل:

وجدت خيار واحد آخر.

  1. في حالتي ، قم بإلغاء تحديد "قمع JIT Optimization على تحميل الوحدة النمطية" أيضًا ، حتى إذا تم تجميع المكتبات بدون معلومات تصحيح. ومع ذلك ، فهو يعمل فقط عند تشغيل المشروع في تكوين الإصدار.

أعتقد أنك تعمي من تأكيد Nunit. يمكنك تحقيق نفس الشيء بمحاولة/صيد بسيطة.

try
{
  _testInstance.TestFunction(null);
  Assert.Fail("The method should have thrown...");
}catch{}

الآن ، لديك كل ما تحتاجه. تفشل إذا لم يتم طرح الاستثناء ويمكن أن يتعامل الكود العادي الخاص بك مع الاستثناءات كما هو متوقع.

هل يمكن تحقيق ذلك عن طريق تعطيل الاستثناء. افتح قائمة التصحيح/الاستثناءات ، وابحث عن استثناءك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top