كيفية اختبار الطريقة التي يتم استدعاؤها بواسطة ربط الإجراء بشكل صحيح

wordpress.stackexchange https://wordpress.stackexchange.com/questions/160567

  •  29-09-2020
  •  | 
  •  

سؤال

يضيف المنشئ في صفي إجراءً إلى ربط الإجراء "init":

class My_Custom_Post_Type {

    function __construct( $type ) {
        $this->type = $type;
        add_action( 'init', array( $this, 'register_my_type' );
    }

    function register_my_type() {
        register_post_type( $this->type);
    } 
}    

كنت أحاول اختبار ذلك في اختبار الوحدة وأدركت أخيرًا أنه لا يوجد سبب لإطلاق خطاف الإجراء "init".هل هناك أي طريقة لاختبار استدعاء طريقة Register_my_type وتسجيل نوع منشور جديد؟

يحرر:

المصدر الرئيسي لحيرتي جاء من عدم فهم العلاقة بين phpunit ومجموعة اختبار WordPress وكود الصف الخاص بي وكود الاختبار الخاص بي.

ما أفهمه الآن هو أنه مع تثبيت أدوات مطور WordPress بالطريقة التي يقترحها هذا البرنامج التعليمي أو من خلال الفسفور الأبيض-CLI, ، دعوة ل phpunit يقوم بتحميل ملف bootstrap والذي يقوم بعد ذلك بربط المكون الإضافي في ملف muplugins_loaded ربط العمل.يقوم ملف التمهيد بعد ذلك بتحميل بيئة اختبار WordPress.بعد انتهاء WordPress من تحميل ملف init يتم تشغيل الخطاف.كود البرنامج المساعد الذي يستخدم init يجب أن تعمل كما هو متوقع.

الاختبارات في الغالب مجرد تعليمات برمجية عادية تستخدم الوظائف أو الفئات المتاحة.ما يختلف عنها هو أنها مكتوبة كطرق لفئة ممتدة WP_UnitTestCase الذي يمتد PHPUnit_Framework_TestCase.إن تضمين هذه الفئة يمنح الاختبارات إمكانية الوصول إلى التأكيدات ومصانع الكائنات وتشغيلها setUp و tearDown طرق بحيث يكون كل اختبار مستقلا عن الآخر.

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

المحلول

اسمحوا لي أن أبدأ بالقول إن init فعل يكون يتم استدعاؤه عند تحميل WordPress، قبل تشغيل الاختبارات.لذا، إذا قمت بتحميل المكون الإضافي/الموضوع الخاص بك باستخدام WordPress (من خلال الربط بـ muplugins_loaded, ، على سبيل المثال)، register_my_type() يجب أن يتم استدعاء الطريقة، إذا تم استدعاء المنشئ الخاص بك من قبل init.(إذا لم تقم بتحميل المكون الإضافي الخاص بك بهذه الطريقة، فقم بإلقاء نظرة على هذا البرنامج التعليمي.)

لذلك في اختبارات وحدتك يجب أن تكون قادرًا على القيام بذلك:

$this->assertTrue( post_type_exists( 'my_post_type' ) );

يمكنك أيضًا استخدام get_post_type() للتأكد من تسجيل نوع المنشور بالوسائط الصحيحة.(هذا هو نفس الشيء الذي أقوم به للتحقق من تسجيل الرموز القصيرة الخاصة بي.)

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

ومع ذلك، يمكنك أيضًا اختبار ما إذا كانت الطريقة تسجل نوع المنشور عن طريق إلغاء تسجيل نوع المنشور واستدعاء الطريقة يدويًا.لا يبدو أن WordPress يوفر ملف deregister_post_type() وظيفة، لذلك عليك أن تعبث مع $wp_post_types العالمية بشكل مباشر.يمكنك حذف نوع المنشور الخاص بك من ذلك ثم الاتصال بالطريقة الخاصة بك والتحقق مما إذا تم تسجيله مرة أخرى.

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