سؤال

كيف يتعامل الناس مع الاستهزاء بـ TcpClient (أو أشياء مثل TcpClient)؟

لدي خدمة تستقبل TcpClient.هل يجب أن أغلف ذلك بشيء آخر أكثر استهزاءً؟كيف يجب أن أتعامل مع هذا؟

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

المحلول

عند القدوم إلى فصول وهمية غير مناسبة للاختبار (على سبيل المثال.مختوم/لا يتم تنفيذ أي واجهة/طرق ليست افتراضية)، ربما ترغب في استخدام مشترك كهربائي نمط التصميم.

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

public interface ITcpClient
{
   Stream GetStream(); 
   // Anything you need here       
}
public class TcpClientAdapter: ITcpClient
{
   private TcpClient wrappedClient;
   public TcpClientAdapter(TcpClient client)
   {
    wrappedClient = client;
   }

   public Stream GetStream()
   {
     return wrappedClient.GetStream();
   }
}

نصائح أخرى

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

لن أسخر من TcpClient مباشرة، لأن ذلك سيظل يربطك بشكل وثيق بالتنفيذ الأساسي على الرغم من أنك كتبت اختبارات.أي أن التنفيذ الخاص بك مرتبط بطريقة TcpClient على وجه التحديد.أنا شخصياً سأحاول شيئًا كهذا:

   [Test]
    public void TestInput(){

       NetworkInputSource mockInput = mocks.CreateMock<NetworkInputSource>();
       Consumer c = new Consumer(mockInput);

       c.ReadAll();
    //   c.Read();
    //   c.ReadLine();

    }

    public class TcpClientAdapter : NetworkInputSource
    {
       private TcpClient _client;
       public string ReadAll()
       { 
           return new StreamReader(_tcpClient.GetStream()).ReadToEnd();
       }

       public string Read() { ... }
       public string ReadLine() { ... }
    }

    public interface NetworkInputSource
    {
       public string ReadAll(); 
       public string Read();
       public string ReadLine();
    }

سيؤدي هذا التنفيذ إلى فصلك عن التفاصيل المتعلقة بـ Tcp تمامًا (إذا كان هذا هو هدف التصميم)، ويمكنك أيضًا إدخال إدخال الاختبار من مجموعة قيم مشفرة بشكل ثابت، أو ملف إدخال اختبار.مفيد جدًا إذا كنت في طريقك لاختبار الكود الخاص بك على المدى الطويل.

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

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

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