لماذا يصر phpunit على فعل الأشياء بطريقة OO؟

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

  •  06-09-2019
  •  | 
  •  

سؤال

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

بالنظر إلى أن بناء جملة PHP هو قبيح للغاية لطرق الاتصال لماذا سيفرض مبدعو Phpunit استخدامه؟

إذا كان الإطار قد حدد كائن عالمي "حديثة"، ثم يؤكد المرتبط بشفافية بالتأكيد مع هذا الكائن، فيمكننا كتابة:

assertEquals("blah", $text);

بدلا من ما يعادلها، ولكن فيربوس:

$this->assertEquals("blah", $text);

ما الذي نحصل عليه بالضبط باستخدام OO في هذا السياق.

من فضلك نورني.

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

المحلول

لأن phpunit مشتق من xunit وهذا هو كيف XUNIT. يفعل ذلك.

لماذا لا يفعل ذلك بهذه الطريقة؟ أنا سعيد لأنك طلبت. السبب الأصلي، كما يشير روبرت، هو أن شونيت يأتي من Smalltalk وتم تعوقه Junit في Java. كلاهما لغات OO-أو لا شيء لذلك لم يكن لديهم خيار.

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

من السهل إضافة وتجاوز أساليب تأكيدها في Phpunit. فقط فئة Subclass. PHPUnit_Framework_TestCase, ، اكتب الشى الذى تريده assert الأساليب والحصول على ورث فئات الاختبار الخاصة بك من الفئة الفرعية الجديدة الخاصة بك. يمكنك أيضا كتابة الافتراضي setup و teardown طرق.

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

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

بالنظر إلى أن بناء جملة PHP هو قبيح للغاية لطرق الاتصال

أعتقد أنك لا تحب ->. وبعد أقترح عليك أن تتعلم العيش معها. OO PHP هو أجمل بكثير من البديل.

نصائح أخرى

سبب واحد جيد هو ذلك assertXXX كاسم طريقة له مخاطر عالية لاسمتام الصدام.

واحد آخر هو أنه مشتق من XUNIT. الأسرة، والتي تتناول عادة اللغات الموجهة للكائنات - Smalltalk في البداية. هذا يجعل من السهل ارتباط نفسك ب "أشقائك" من مثل Java و Ruby.

ليست إجابة مباشرة، ولكن اعتبارا من phpunit 3.5، لا تضطر إلى الكتابة $this-> أي أكثر من ذلك. تمت إضافة Phpunit 3.5 مكتبة وظيفة للتأكيدات التي يجب عليك تضمينها

require_once 'PHPUnit/Framework/Assert/Functions.php';

ثم يمكنك القيام به

assertEquals('foo', $bar);

انظر مدونة سيباستيان بيرغمان وظيفة حول هذا الموضوع

وجود حالات الاختبار في طرق الفصل يحفظ العمل من أجل phpunit. بسبب نقص المخابرات المدمج في المخابرات لا يمكن العثور على أو التعامل مع وظائف الاختبار الخالص. الاضطرار فقط إلى التعرف على رسائل -> تأكيد * () - في سلسلة منطقية بسيطة - يحفظ مرة أخرى منطق المعالجة (لل phpunit، وليس مؤلف حالة الاختبار). كل هذا الملح النحوي الذي يحفظ النفقات العامة من وجهة نظر phpunit / simpletest.

لن تكون مشكلة فنية في التقاط رسائل الخطأ / التحذير أو الاستثناءات أو التعرف على بيان تأكيد PHPS الأصلي (). لم يتم ذلك لأن API الصعب يبدو أكثر مشاريع.

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