سؤال

أحاول تعلم حقن التبعية واجهت مشكلة ، عندما تختبر الوحدة التطبيق.

أنا أكتب تطبيق وحدة تحكم ويتم إنشاء الحاوية وتهيئتها في Main () ، وهي متوفرة كـ get-property في Program.Container, ، لذلك في أي مكان في طلبي يمكنني الاتصال Program.Container.Resolve<..>().

لدي فئة ServiceValidator مثل هذا:

public class ServiceValidator
{
    private readonly IConfiguration _configuration;
    private readonly IService _service;

    public ServiceValidator(IConfiguration configuration, IService service)
    {
        _configuration = configuration;
        _service = service;
    }

في فصل آخر أستخدمه

ServiceValidator serviceValidator = Program.Container.Resolve<ServiceValidator>();
serviceValidator.VerifyVersion();

إنها دعوة إلى Program.Container.Resolve هذا يسبب لي مشاكل في اختبار الوحدة ، لأنه لم يتم إعداده.

هل هذه ممارسة سيئة ، للاتصال بتصميم الحاوية؟ يمكنني إنشاء مثيل ServiceValidator في Main() ومرر الكائن حوله ، لكن هذا يبدو غبيًا لأنه سيؤدي إلى الكثير من المعلمات للكائنات التي يتم نقلها للتو إلى الطريقة التالية.

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

إذا كان الأمر مهمًا ، فأنا أستخدم الوحدة و C#

شكرًا :-)

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

المحلول

هل هذه ممارسة سيئة ، للاتصال بتصميم الحاوية؟ يمكنني إنشاء مثيل ServiceValidator في Main () وتمرير الكائن حوله ، لكن هذا يبدو غبيًا لأنه سيؤدي إلى الكثير من المعلمات للكائنات التي يتم نقلها للتو إلى الطريقة التالية.

عندما تستخدم حقن التبعية على طول الطريق ، فلن تحتاج إلى تمرير الكثير من المعلمات إلى الكائنات. يجب أن يحتوي مُنشئ كل كائن كمعلمات فقط لتلك التبعيات التي تستخدمها مباشرة - لن يعرف عن التبعيات المتعدية لتبعياتها المباشرة.

لذلك إذا كان لديك فئة X تتطلب خدمة ServiceValIdator ، فسيحتوي الفئة X على معلمة مُنشأة من نوع ServiceValidator. ثم إذا استخدمت بعض الفئة Y الفئة X ، فسيكون لدى الفئة Y معلمة مُنشأة من النوع X. لاحظ أن Y لا يعرف شيئا حول ServiceValidator ، لذلك لا تحتاج إلى تمرير ServiceValidator من فئة إلى أخرى - المكان الوحيد الذي يتم استخدامه هو عند إنشاء X ، وغالبًا ما يتم ذلك عن طريق إطار DI أو في مكان واحد فقط في مكان مكتوب بخط اليد مصنع.

بعض الروابط لمزيد من المعلومات:

نصائح أخرى

عادةً ما أسمح للمكالمات بحل التبعيات من الحاوية في أماكن مثل الرئيسية على الرغم من أنني ما زلت أحاول الاحتفاظ بها إلى الحد الأدنى. ما أقوم به بعد ذلك هو تكوين الحاوية في طريقة تهيئة فئة الاختبار. لقد تم تهيئتها مع تطبيقات مزيفة لأي فئة اختبار تحتاج إلى استدعاء الحاوية.

فئات الاختبار التي لا تسمي أي شيء يتطلب تهيئة الحاوية قادرة على تجاهلها وعدم استخدام مزيفة. عادة ما أستخدم النسيج في تلك الحالات.

أنا أيضا استخدام Microsoft Service Locator بحيث تكون التبعية التي أتناولها على شيء من إطار .NET بدلاً من على حاوية معينة. هذا يسمح لي أن أسقط الطريق استخدم أي شيء أريده حتى حاوية مخمرة في المنزل.

يمكنك استخدام فئة ثابتة كمهيئة للحاوية الخاصة بك. شيء مثل bootstrapper.cs سوف بخير. يمكنك بعد ذلك الرجوع إلى أساليب الفصل في الكود والاختبارات.

حسنًا ، ما تفعله تقنيًا هو موقع خدمة في صفك.

أتذكر قراءة هذا المقال لفترة من الوقت:

http://martinfowler.com/articles/injection.html

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

تكمن المشكلة في حقيقة أنك تحاول اختبار الطريقة الرئيسية. هذه الطريقة مستحيلة تقريبًا لاختبار الوحدة.

أود أن أزعم أنه من الأفضل عدم اختبار الطريقة الرئيسية لأن:

  • إن التركيز على اختبار الوحدة الحديثة يدور حول التصميم
  • يجب عليك تقليل التبعية على التكوين في اختبارات الوحدة. يمكن اختبار التكوين مع اختبارات الدخان أو التكامل.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top