سؤال

أود أن أسخر من بيانات الكائن ، وليس الكائنات نفسها. بمعنى آخر ، أود إنشاء مجموعة من الكائنات N ونقلها إلى وظيفة تنشئ سلاسل وأرقام بيانات عشوائية. هل هناك أي شيء للقيام بذلك؟ فكر في الأمر على أنه أ لوريم ipsum لبيانات الكائن. القيود حول النطاقات العددية وما إلى ذلك ليست ضرورية ، ولكنها ستكون مكافأة.

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

المحلول

أول شيء فكرت فيه عندما قرأت سؤالك هو QuickCheck ، وهي أداة اختبار لـ Haskell. في QuickCheck ، تحدد الخصائص (الثوابات) التي يجب أن يكون لها وظيفتك ، ويمكنك تحديد نطاقات صالحة للمدخلات (بالإضافة إلى مجموعة أخرى إذا كان الإخراج يطابق المواصفات. لقد اكتشفت قليلاً ، اكتشف أن هناك منفذًا فاحصًا له ، لذلك يوجد QuickCheck في عالم .NET:

http://fscheck.codeplex.com/

هناك أيضًا مشروع MS Research Project PEX قد يكون قريبًا مما تفكر فيه:

http://research.microsoft.com/en-us/projects/pex/

"... يجد PEX قيمًا مثيرة للاهتمام مدخلات خارجية لأساليبك ، والتي يمكنك حفظها كجناح اختبار صغير ذو تغطية عالية الكود. Microsoft PEX هي إضافة Visual Studio للاختبار .NET Framework Applications."

لم أستخدمها من قبل ، لكن يبدو أنه جيد لإنشاء بيانات حالة الحافة التي تمارس أي وجميع فروع الوظيفة. إنه في الواقع يحلل وظيفة بدلاً من مجرد إلقاء أشياء عشوائية حقيقية عليها.

نصائح أخرى

يبدو أن هناك أيضًا منفذ .NET من الياقوت Faker GEM ، التي تحصل على الكثير من الاستخدام لتزوير كائنات البيانات المزيفة في روبي. لم أستخدمها ، لكن قد يكون الأمر يستحق النظر فيه:

https://github.com/slashdotdash/faker-cs

أنا مندهش من أنه لم يذكر أحد Autofixture بعد:

[TestMethod]
public void IntroductoryTest()
{
    // Fixture setup
    Fixture fixture = new Fixture();

    int expectedNumber = fixture.CreateAnonymous<int>();
    MyClass sut = fixture.CreateAnonymous<MyClass>();
    // Exercise system
    int result = sut.Echo(expectedNumber);
    // Verify outcome
    Assert.AreEqual<int>(expectedNumber, result, "Echo");
    // Teardown
}

يمكنك إعداد ObjectRandomizer الفئة التي تأخذ مجموعة من الكائنات ، وتستخدم الانعكاس لفحص الكائن للأعضاء الخاصين ، ثم استخدام الانعكاس لتعيين قيمة عشوائية لهذا العضو. هذا لا يعمل إلا إذا كنت لا تهتم بكيما تبدو البيانات العشوائية لكل كائن.

بدلاً من ذلك ، يمكنك إنشاء مجموعة من الفئات لكل كائن بيانات ينشئ بيانات عشوائية لهم. قد يعمل هذا بشكل جيد إذا لم تكن ترغب في تضمين طرق الجيل العشوائي داخل التجميعات الفعلية. على سبيل المثال ، إذا كان لديك ملف Person الفصل ، يمكن أن يكون لديك ملف PersonRandomizer الفصل في مجموعة اختبار. في فئة الاختبار الخاصة بك (أو في Randomizer الفصل) ، يمكنك بعد ذلك استخدام الانعكاس للعثور على نوع PersonRandomizer, ، وإذا كان موجودًا ، اتصل PersonRandomizer.Randomize(Person p).

إذا ذهبت مع اقتراح Yahya ، أقترح إنشاء واجهة IRandomizable بالنسبة للكائنات التي تدعم العشوائية أو تميزها بسمات جديدة Randomizable يمكنك اكتشافها في وقت التشغيل.

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

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