سؤال

سؤال قصير ، لماذا Assert.AreEqual(1.0, double.NaN, 1.0) يمر؟ بينما Assert.AreEqual(1.0, double.NaN) فشل.

هل هو خطأ في MSTEST (microsoft.visualstudio.feralitytools.unittestframework) أم أنني أفتقد شيئًا هنا؟

مع أطيب التحيات ، egil.


تحديث: من المحتمل أن يضيف ، أن السبب وراء سؤالي هو أن لدي مجموعة من اختبارات الوحدة التي مرت للأسف بسبب نتيجة بعض عملية المصفوفة الجبرية الخطية كونها NAN أو (+/-) اللانهاية. اختبارات الوحدة جيدة ، ولكن نظرًا لأن Assert.areequal على الزوجي مع دلتا سوف تمر عندما تكون فعلية أو متوقعة تكون نان أو ما لا نهاية ، فقد تركت لأعتقد أن الكود الذي كنت أختبره كان صحيحًا.

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

المحلول

كن حذرا. نان غريب ، يشبه إلى حد ما فارغة في العديد من DBMSS ، ويجب ألا تقارن القيم به (سواء مباشرة ، أو مع Assert.areequal). من المستندات double.nan:

استخدم Isnan لتحديد ما إذا كانت القيمة ليست رقمًا. لا يمكن تحديد ما إذا كانت القيمة ليست رقمًا عن طريق مقارنتها بقيمة أخرى تساوي NAN.

double zero = 0;
Console.WriteLine((0 / zero) == Double.NaN);  // prints false
Console.WriteLine(Double.IsNaN(0 / zero));  // prints true

يجب عليك أن تنظر إلى الداخلية من Assert (مزدوجة ، مزدوجة ، مزدوجة) لمعرفة ما يجري ، ولكن بشكل عام ، أنت تعتمد على السلوك غير المحدد بالنسبة إلى NAN.

نصائح أخرى

الإجابات خارج التاريخ. إذا تم إصلاح الخطأ ، متى ، وفي أي إصدارات من أي تجميع؟

هذا صحيح ، تم إصلاحه في VS2013 مع microsoft.visualstudio.qualitytools.unittestframework.dll Assembly ، الإصدار 10.0.0.0. موجود في Legacy GAC ، C: Windows Assembly ، يحتوي أيضًا على إصدار 10.1.0.0.

هناك قصة DLL Hell هنا ، كان الإصدار 10.1.0.0 هو الإصدار المستخدم في VS2010. كان لديه الخطأ ، وليس التحقق بشكل صحيح من Double.nan. ارتكبت Microsoft خطأً ، فقد قاموا بإصلاح 10.1.0.0 لكنها لم تغير رقم الإصدار. لذلك أي شخص قام بتثبيت VS2010 بعد، بعدما سيتأذى تثبيت VS2013 ، وسيقوم بالكتابة فوق DLL مع إصدار عربات التي تجرها الدواب.

كشف الجحيم DLL ليس بهذه البساطة ، لكنه يظهر من توصيل المقالة ومن الطريقة التي يعمل بها على الجهاز الخاص بي ، حددوا وضع الفشل من شكوى العميل. وقدم إصلاحًا ، تم تسليمه في تحديث. غير واضح ، بعد يوليو 2014. ستستخدم الآن V10.0.0.0 ، وعداء اختبار MSTEST.EXE و QTAgents لديهم ملف .config <bindingRedirect> هذا يعيد التوجيه من 10.1.0.0 إلى 10.0.0.0 (وليس خطأ مطبعي). تأكد من الحصول على آخر تحديث ، حاليًا 4. ابحث عن المساعدة + حول ما إذا كنت غير متأكد من التحديث الذي قمت بتثبيته.

بالنسبة للسجل ، حصل الرمز الثابت على شيكات محددة لـ double.nan ، يبدو أن هذا:

public static void AreEqual(double expected, double actual, double delta, string message, params object[] parameters)
{
    if ((double.IsNaN(expected) || double.IsNaN(actual)) || double.IsNaN(delta))
    {
        string str = (string) FrameworkMessages.AreEqualDeltaFailMsg((message == null) ? string.Empty : ReplaceNulls(message), expected.ToString(CultureInfo.CurrentCulture.NumberFormat), actual.ToString(CultureInfo.CurrentCulture.NumberFormat), delta.ToString(CultureInfo.CurrentCulture.NumberFormat));
        HandleFail("Assert.AreEqual", str, parameters);
    }
    if (Math.Abs((double) (expected - actual)) > delta)
    {
        string str2 = (string) FrameworkMessages.AreEqualDeltaFailMsg((message == null) ? string.Empty : ReplaceNulls(message), expected.ToString(CultureInfo.CurrentCulture.NumberFormat), actual.ToString(CultureInfo.CurrentCulture.NumberFormat), delta.ToString(CultureInfo.CurrentCulture.NumberFormat));
        HandleFail("Assert.AreEqual", str2, parameters);
    }
}

يستخدم MSTEST الصيغة التالية ل Assert.AreEqual<double>(expected, actual, delta) طريقة:

if (Math.Abs(expected - actual) > delta)
    Assert.HandleFail("Assert.AreEqual", ...)

العملية تقل إلى double.NaN > delta, الذي يعود صحيح في هذه الحالة. أو غير محدد.

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