كصاحب لسلسلة المدونة الخاصة بي على .NET السخرية الأطر وكيفية عملها ، يحاول هذا المستودع تنفيذ اختبارات الوحدة نفسها مع السخرية باستخدام كل من الأطر السخرية الرئيسية المتاحة لـ .NET.
يهدف هذا المشروع إلى أن يكون مرجعًا لأي شخص يتطلع إلى مقارنة أطر عمل السخرية .NET أو رؤية أمثلة بناء الجملة لإطار عمل معين. ليس المقصود أن تكون مرجعًا شاملاً ، فليس من المذهل أن تكون خالية من الأخطاء (ولكن يرجى إعلامي إذا وجدت أي مشكلات).
من أجل كتابة الاختبارات ، نحتاج إلى بعض التعليمات البرمجية التي تحتاج إلى الاختبار. وهكذا ، قمت بإنشاء LunchNotifier ، وهو فئة من عالم العالم الذي يمكن أن تتم ضده ، حيث يمكن كتابة اختبارات الوحدة (مع Mocks).
واحدة من الفوائد المقدمة إلى Stack Overflow Emplpoyees التي تعمل في مكتب نيويورك هي غداء مجاني من الطهاة الداخليين. كل يوم ، عندما يكمل الطهاة إعداد الوجبة ، يخرج إشعار للموظفين في المكتب لإعلامهم بأن الطعام متاح.
في مشروع CodeBeingTested ، فئة LunchNotifier هي هدفنا الرئيسي.
يحتوي هذا الفئة على خمسة أعمدة خارجية تحتاج إلى السخرية من أجل إجراء اختباراتنا:
INotificationService (تم حقنه عبر مُنشئ)ILogger (تم حقنه عبر مُنشئ)IEmployeeService (تم حقنها عبر مُنشئ)IEmployee ) في مكتب نيويوركIEmployee (تم إرجاعها من IEmployeeService )System.DateTime المنطق الرئيسي هو في LunchNotifier.SendLunchtimeNotifications() . تتضمن هذه الطريقة مكالمة مضمنة إلى System.DateTime.Now ، والتي لا يمكن للسخرية من خلال أطر عمل معروفة مثل MOQ أو Rhinomocks:
public void SendLunchtimeNotifications()
{
var now = DateTime.Now;
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
يتم توفير تنفيذ بديل للاستخدام من خلال إطارات قابلة للضرب في LunchNotifier.SendLunchtimeNotifications_DateTimeSeam() ، حيث تم استخراج الدعوة إلى DateTime.Now في طريقة خاصة به ، والتي يمكن استبدالها في وهمية:
public virtual DateTime GetDateTime() => DateTime.Now;
public void SendLunchtimeNotifications_DateTimeSeam()
{
var now = GetDateTime();
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
يحاول كل من المشاريع المتبقية تنفيذ مجموعة مماثلة من اختبارات الوحدة ضد LunchNotifier باستخدام أطر عمل مختلفة.
تتم كتابة جميع الاختبارات باستخدام Nunit V3.10 عن طريق حزمة Nuget.
في بعض الحالات ، هناك طرق متعددة للاقتراب من اختبار باستخدام إطار السخرية ، لذلك قدمت متغيرات متعددة من الاختبار لعرض الأساليب المختلفة.
ينشئ هذا الاختبار موظفًا وهميًا "بوب" الذي يفضل إخطارات البريد الإلكتروني ويستخدم السخرية لضمان أن منطق LunchNotifier سيرسل له بريدًا إلكترونيًا عندما يكون الغداء جاهزًا.
يقوم هذا الاختبار بإنشاء موظفين وهميين ، "بوب" و "مارثا" ويضمن أنه إذا أرسل إخطارًا إلى أحدهما يؤدي إلى تسجيل الخطأ ولا يمنع الموظفين الباقين من الإخطار.
يستخدم هذا الاختبار بناء جملة TestCase من Nunit لتشغيل حالتين اختبار ، واحدة لل 1 مساءً وواحدة لما بعد الساعة 1 مساءً ، لضمان استخدام قالب الإخطار المناسب بناءً على الوقت من اليوم.
بالنسبة للأطر غير المقيدة ، يمكن التحكم بشكل مباشر DateTime.Now لإرجاع وقت إدخال الاختبار ، ومع ذلك ، لا يمكن للأطر المقيدة ، لذلك يجب عليهم استخراج المكالمة إلى DateTime.Now الآن في طريقة spery وتعديل سلوك الطريقة الجديدة بدلاً من ذلك. وبالتالي الحاجة إلى SendLunchtimeNotifications_DateTimeSeam المتغير.
النوع: مقيد
المشروع: https://github.com/moq/moq4/wiki/quickstart
nuget: https://www.nuget.org/packages/moq/
النوع: مقيد
المشروع: https://github.com/hibernating-rhinos/rhino-mocks
Nuget: https://www.nuget.org/packages/rhinomocks
تحذير: Rhinomocks هو مشروع ميت فعليًا ، ومن المحتمل ألا يقدم الدعم للتغيرات المستقبلية في .NET ، مثل .NET Core. لا أقترح عليك البدء في استخدام هذا الإطار إذا كنت لا تستخدمه بالفعل.
لتشغيل هذه الاختبارات ، يجب أن يكون لديك VS2017 Enterprise (أو Equiv) مثبتة.
النوع: مقيد
المشروع: http://nsubstitute.github.io/
nuget: https://www.nuget.org/packages/nsubstitute
النوع: غير مقيد
يأتي Microsoft Fakes كجزء من Visual Studio 2017 Enterprise أو Visual Studio 2015 Ultimate ولا يتوفر كمكون Sperere.
لا تدعم Fakes أصلاً بالتحقق من صحة الأسلوب AssertWasCalled ، لذلك استخدم حزمة Nuget إضافية (التي ساهمت بها) لتوفير هذه الميزة: fakes.contrib / nuget
النوع: غير مقيد
معلومات المنتج: https://www.typemock.com/isolator
يتطلب هذا المنتج ترخيصًا مدفوعًا (تتوفر تجربة مجانية مدتها 15 يومًا) للقيام بسخرية غير مقيدة. كان Typemock لطيفًا بما فيه الكفاية لتزويدني برخصة مجتمع مجانية حتى أتمكن من العمل في مشاريع مثل هذه.