سؤال

أنا جديد تمامًا على TDD وأذهب مع Nunit و Moq. لدي طريقة أتوقع فيها استثناء ، لذلك أردت أن ألعب قليلاً مع ميزات الأطر.

يبدو رمز الاختبار الخاص بي على النحو التالي:

    [Test]
    [ExpectedException(ExpectedException = typeof(MockException), ExpectedMessage = "Actual differs from expected")]
    public void Write_MessageLogWithCategoryInfoFail()
    {
        string message = "Info Test Message";

        Write_MessageLogWithCategory(message, "Info");

        _LogTest.Verify(writeMessage =>
            writeMessage.Info("This should fail"),
            "Actual differs from expected"
        );
    }

لكنني دائمًا ما أتلقى الخاطئة أن رسالة الخطأ التي تختلف رسالة الاستثناء الفعلية عن الرسالة المتوقعة. ما الخطأ الذي افعله؟

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

المحلول

لسوء الحظ ، فإن Resharper Test Runner لديه خطأ/قيود - فهو لا يتعامل مع سمات ExpectedException. لديك خياران:

  1. استخدم بعض عداء الاختبار الآخر (على سبيل المثال nunit -gui.exe ، يتم شحنه مع nunit) - لكن هذا النهج يجعله مؤلمًا لتصحيح اختباراتك

  2. التقط والتحقق من الاستثناء يدويًا ، باستخدام النمط التالي:

    Test] public void write_messageLogWithCategoryInFofail () {try {string message = "info test message" ؛

      Write_MessageLogWithCategory(message, "Info");
    
      _LogTest.Verify(writeMessage =>
          writeMessage.Info("This should fail"),
          "Actual differs from expected"
      );
      Assert.Fail("Expected exception");
    }
    catch(MockException e)
    {
      Assert.AreEqual("Actual differs from expected", e.Message);
    }
    

    }

إنه لأمر مخز حقيقي ، لأن الطريقة الوصفية للقول أنك تتوقع استثناء أجمل بكثير!

في ملاحظة جانبية ، آمل أن يكون الرمز أعلاه هو اللعب فقط مع الإطار - عادةً ما لا تصطاد Mockexceptions :)

نصائح أخرى

يمكنك استخدام المعلمة الإضافية MatchType = MessageMatch.Regex.

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