اختبار الوحدة مع نمط الوسيط - كل من القطاع الخاص إلى العامة

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

سؤال

أنا أستخدم نمط الوسيط لتسهيل اختبار وحدة كائنات واجهة المستخدم الرسومية.

مثال رمز PSUDO:

Class MyGuiClass
{
  //...  Declare and initialize mediator to be a MyMediator
  private void On_SomeButtonPressed()
  {
     mediator.SomeButtonWasPressed();
  }
}

Class MyMeditator
{
  public void On_SomeButtonPressed()
  {
     //.. Do something now that the button was pressed
  }

}

هذا جميل لأنني أستطيع الآن اختبار الوحدة ما يحدث عندما يتم الضغط على شخص ما دون الحاجة إلى إنشاء نافذة.

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

أنا حاليا إعادة صياغة فئة كبيرة جدا لاستخدام هذا النمط وأتساءل عما إذا كان هناك ما يمكن أن تتحكم في رؤية من يمكنه إجراء mymymedor أو الفصول الدراسية من الأساليب العامة. (قد لا تكون هذه ممكنة أو حتى اللازمة، لكنني اعتقدت أنني سأطلبها.)

(أنا أستخدم C # 3.0 مع .NET 3.5 SP1)

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

المحلول

النقطة المهمة هي أنه ترغب في الواجهة العامة لفئة لإظهار "واجهة برمجة تطبيقات" الجمهور للفئة، لذا في جعل الأساليب الخاصة العامة، فأنت تجعل الفصل أكثر مربكة وأقل "نظيفة"؟

بعض الأشياء التي يمكنك القيام بها: 1) فكر في ما هو في الواقع هو "الوجه العام" من فئة الوسيط الخاص بك (أو كائن متواضع) وسعنت هذه الأساليب الجمهور. حتى لو كانت تستخدم فقط داخل الجمعية - وليس جزءا من الوجه العام للجمعية - لا بأس أن تلاحظ أن فئة الوسيط الخاصة بك لم يتم الإعلان عنها العامة. لذا فإن أساليبها العامة لا تزال داخلية للجمعية.

2) يمكنك إعاقة الحجز باستخدام داخلي خاص (ثم قم بتعيين سمة internalsvisibleto التجميع إذا كانت فئات الاختبار في تجميع منفصل).

3) خذ نهج "الصندوق الأسود" للاختبار الوحدات حيث من المبدأ الذي لا تحتاج أبدا لاختبار المحفوظات لأنهم يتم اختبارهم عبر استخدامهم عند الاتصال بهم من الأساليب العامة.

نصائح أخرى

أعتقد أنه لا يهم .. من لديه مثيل للوسيط، بخلاف واجهة المستخدم الرسومية؟ إذا قام شخص ما، هل ستسمي الطريقة؟ إذا كان الأمر كذلك، فهل يهم؟ هل سيكون من الصعب الإشعارات وتشخيص وإصلاح الخطأ؟

أعتقد أنه يمكنك تحقيق ما تبحث عنه مع الأحداث رغم ذلك:

على سبيل المثال

/* in the gui class (view) */
public event EventHandler OnButtonClicked;

/* in the mediator */
public MyMediator(MyView view) 
{
    view.OnButtonClicked += HandleButtonClicked;
}

private void HandleButtonClicked(object sender, EventArgs e)
{

}

لست متأكدا من C #، ولكن في Java، يمكنك إعلان شيء كوصول إلى مستوى الحزمة (في Java عن طريق حذف جهاز الوصول). ما أقوم به هو إنشاء تسلسل هرمي اختبار منفصل يزاوي بنية الحزمة الخاصة بي، لذلك لاختبار COM.ABCMYCLASS، سآخذ Com.Abcmyclasstest، والتي يمكن بعد ذلك الوصول قانونا إلى طرق الوصول إلى الحزمة في MyClass.

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

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