كيفية الوصول إلى الفئات في تجميع آخر لأغراض اختبار الوحدة؟

StackOverflow https://stackoverflow.com/questions/1211707

  •  06-07-2019
  •  | 
  •  

سؤال

إنني أنتقل الآن إلى اختبار الوحدات بطريقة Visual-Studio 2008، وأتساءل ما هي أفضل طريقة لإنجاز التجميع المتقاطع class الوصول لأغراض الاختبار.

في الأساس، لدي مشروعان في حل واحد:

  1. مشروعي (C#)
  2. MyProjectTests (مشروع اختبار C#)

يتمتع كل شيء في MyProject حاليًا بإمكانية الوصول الافتراضية، وهو ما يعني، إذا كنت أتذكر بشكل صحيح، أن كل شيء يعمل بشكل فعال internal.أنا أتطلع في الغالب للاختبار في class المستوى، ولكن هناك عدد قليل delegates متضمن.

من المحتمل أن تكون هناك واجهة برمجة تطبيقات خارجية في وقت ما في المستقبل، لكنني قطعت حوالي 20% من الطريق لاكتمال الميزة (على الأقل على الورق) وأشعر بالقلق الشديد بشأن وضع المزيد من التعليمات البرمجية فوق هذا النواة غير المختبرة.وبناءً على ذلك، أود إجراء بعض الاختبارات الآن، قبل أن يكتمل التطبيق بدرجة كافية للتطبيق التقليدي (اقرأ:اختبار وظيفي سيئ و/أو كسول) وبالتأكيد قبل إصدار واجهة برمجة التطبيقات الخارجية للإصدار n+1.

بالإضافة إلى الإجابة المباشرة، سيكون موضع تقدير كبير مثال على الحل.

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

المحلول

يمكنك استخدام سمة مستوى التجميع InternalsVisibleToAttribute لتحقيق هذا.

يضيف

[assembly:InternalsVisibleTo("MyProjectTests")]

إلى AssemblyInfo.cs في مجموعة MyProject الخاصة بك.

نصائح أخرى

يمكنك اختبار الأساليب الداخلية، عن طريق إضافة سمة إلى AssemblyInfo.cs لمشروعك الرئيسي، مما يتيح الوصول إلى الأساليب الداخلية لتجميع مسمى:

[التجميع:InternalsVisibleTo("MyProjectTestsNameSpace.MyProjectTests")]

مزيد من المعلومات هي هنا

تحتاج إلى إضافة

[assembly:InternalsVisibleTo("Unit.Tests.Assembly")] 

إلى AssemblyInfo.cs الخاص بـ "MyProject (C#)".يتيح ذلك بعد ذلك لاختباراتك الوصول إلى الطرق الداخلية للاختبار.

يبدو أنك بحاجة إلى InternalsVisibleToAttribute

ومع ذلك فإنني أوصي بعدم اتباع هذا النهج - اختبر فئاتك الداخلية عبر الواجهة العامة أو واجهة برمجة التطبيقات (API).

بالرغم من [InternalsVisibleTo] هي الطريقة الأكثر منطقية للمنظمة البحرية الدولية، وهناك طريقتان أخريان على الأقل للقيام بذلك:

  • باستخدام انعكاس

     var method = instance.GetType().GetMethod(
        methodName, BindingFlags.NonPublic | BindingFlags.Instance, 
        null, paramTypeArray, null);
     return method.Invoke(instance, parameters);
    

المشكلة في هذا الأسلوب هي أنه إذا تغير اسم الطريقة أو التوقيع، فسيبدأ اختبار الوحدة بالفشل في وقت التشغيل، بينما [InternalsVisibleTo] كان من السهل التقاط هذا التغيير العاجل في وقت الترجمة.

لقد وجدت هذا واحد https://msdn.microsoft.com/en-us/library/hh598957.aspx نأمل أن يساعد شخص ما.

ملخص:

  • في مشروع اختبار الوحدة الخاص بك، قم بإضافة مرجع إلى الكود قيد الاختبار.إليك كيفية إنشاء المرجع لمشروع التعليمات البرمجية في نفس الحل:
  • حدد المشروع في Solution Explorer.
  • من قائمة المشروع، اختر إضافة مرجع....
  • في مربع الحوار "إدارة المراجع"، افتح عقدة الحل واختر المشاريع.
  • تحقق من اسم مشروع التعليمات البرمجية وأغلق مربع الحوار.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top