تعطي وظيفة WordPress نتائج مختلفة خارج اختبار PHPUnit مقارنة بالداخل

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

  •  28-09-2020
  •  | 
  •  

سؤال

لقد بذلت جهدًا كبيرًا لجعل PHPUnit تعمل بشكل جيد مع WordPress (بمساعدة هذا, هذا, هذا, هذا, ، و هذا) ، وأعتقد أنني قد اقتربت جدًا.يبدو الكود الذي أقوم بتشغيله مباشرة قبل اختباراتي هكذا (تم رفعه حرفيًا بشكل أساسي من هذا المقال):

( PHP_SAPI === 'cli' ) || die( 'Access Denied' );

define( 'PHPUNIT_DB_PREFIX', 'phpunit_' );

global $wp_rewrite, $wpdb;

define( 'WP_MEMORY_LIMIT', '100M' );

require_once( dirname( __FILE__ ) . '/../../../../wp-load.php' );
require_once( ABSPATH . 'wp-admin/includes/admin.php' );

wp_set_current_user( 1 );

يبدو أنه يعمل بشكل جيد، باستثناء أن الوظائف تُرجع أشياء مختلفة بناءً على مكان وجودها في الملف.على سبيل المثال، خارج فئة الاختبار، shortcode_exists يُرجع صحيحًا، بينما في حالة الاختبار يكون الأمر نفسه تمامًا shortcode_exists بيان يعود كاذبة.ما الخطأ الذي افعله؟

فيما يلي محتويات ملف الاختبار بأكمله:

[لقد تغير الملف منذ أن نشرت هذا في الأصل...]

يحرر:حسنًا، لقد تابعت البرنامج التعليمي لـ J.D. بأكبر قدر ممكن من الدقة.انها تشعر حقًا يغلق.أتلقى الآن هذا الخطأ:

PHPUnit_Framework_Error_Warning : copy(data/not-gettexted-0.php): failed to open stream: No such file or directory
#0 [internal function]: PHPUnit_Util_ErrorHandler::handleError(2, 'copy(data/not-g...', '/Applications/w...', 41, Array)
#1 /Applications/wordpress-3.8.3-0/apps/wordpress/htdocs/wp-content/plugins/hf-accountability/tests/wordpress-dev/trunk/tools/i18n/t/NotGettextedTest.php(41): copy('data/not-gettex...', 'data/not-gettex...')
#2 [internal function]: NotGettextedTest->test_replace()
#3 phar:///Applications/wordpress-3.8.3-0/apps/wordpress/htdocs/wp-content/plugins/hf-accountability/tests/phpunit-lts.phar/phpunit/Framework/TestCase.php(988): ReflectionMethod->invokeArgs(Object(NotGettextedTest), Array)
#4 phar:///Applications/wordpress-3.8.3-0/apps/wordpress/htdocs/wp-content/plugins/hf-accountability/tests/phpunit-lts.phar/phpunit/Framework/TestCase.php(838): PHPUnit_Framework_TestCase->runTest()
#5 phar:///Applications/wordpress-3.8.3-0/apps/wordpress/htdocs/wp-content/plugins/hf-accountability/tests/phpunit-lts.phar/phpunit/Framework/TestResult.php(648): PHPUnit_Framework_TestCase->runBare()
#6 phar:///Applications/wordpress-3.8.3-0/apps/wordpress/htdocs/wp-content/plugins/hf-accountability/tests/phpunit-lts.phar/phpunit/Framework/TestCase.php(783): PHPUnit_Framework_TestResult->run(Object(NotGettextedTest))
#7 phar:///Applications/wordpress-3.8.3-0/apps/wordpress/htdocs/wp-content/plugins/hf-accountability/tests/phpunit-lts.phar/phpunit/Framework/TestSuite.php(779): PHPUnit_Framework_TestCase->run(Object(PHPUnit_Framework_TestResult))
#8 phar:///Applications/wordpress-3.8.3-0/apps/wordpress/htdocs/wp-content/plugins/hf-accountability/tests/phpunit-lts.phar/phpunit/Framework/TestSuite.php(749): PHPUnit_Framework_TestSuite->runTest(Object(NotGettextedTest), Object(PHPUnit_Framework_TestResult))
#9 phar:///Applications/wordpress-3.8.3-0/apps/wordpress/htdocs/wp-content/plugins/hf-accountability/tests/phpunit-lts.phar/phpunit/Framework/TestSuite.php(709): PHPUnit_Framework_TestSuite->run(Object(PHPUnit_Framework_TestResult), false, Array, Array, false)
#10 phar:///Applications/wordpress-3.8.3-0/apps/wordpress/htdocs/wp-content/plugins/hf-accountability/tests/phpunit-lts.phar/phpunit/TextUI/TestRunner.php(350): PHPUnit_Framework_TestSuite->run(Object(PHPUnit_Framework_TestResult), false, Array, Array, false)
#11 phar:///Applications/wordpress-3.8.3-0/apps/wordpress/htdocs/wp-content/plugins/hf-accountability/tests/phpunit-lts.phar/phpunit/TextUI/Command.php(176): PHPUnit_TextUI_TestRunner->doRun(Object(PHPUnit_Framework_TestSuite), Array)
#12 /private/var/folders/r5/0w5bp7b13pndfymz_pgf_zz00000gn/T/ide-phpunit.php(268): PHPUnit_TextUI_Command->run(Array, true)
#13 /private/var/folders/r5/0w5bp7b13pndfymz_pgf_zz00000gn/T/ide-phpunit.php(506): IDE_Base_PHPUnit_TextUI_Command::main()
#14 {main}

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

تحرير تحرير:تم حل هذا الخطأ الأخير عن طريق تعديل تكوين PhpStorm الذي كنت أستخدمه.يجب عليك ضبطه على "استخدام ملف التكوين البديل" وتعيين نطاق الاختبار على "محدد في ملف التكوين".

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

المحلول

السبب وراء حدوث ذلك ليس في الواقع بسبب أي شيء في الكود الذي قمت بنشره، في حد ذاته، ولكن بسبب كيفية تكوين PHPUnit.يتم تخزين عمليات الاسترجاعات الخاصة بالرمز القصير في ملف عام ($shortcode_tags).عند تحميل WP، يتم تسجيل الرمز القصير وإضافته إلى الملف العمومي.أنت أتصل shortcode_exists(), ، فإنه يتحقق $shortcode_tags, ، ويعود true.ثم تبدأ PHPUnit في تشغيل اختباراتك.ويمسح نطاق المتغير العالمي.لذلك، عندما يتم تشغيل الاختبار الخاص بك، $shortcode_tags لم يعد موجودا، لذلك shortcode_exists() تقارير تفيد بأن الرمز القصير الخاص بك غير مسجل.(ستقوم PHPUnit بعد ذلك باستعادة النطاق العالمي إلى ما كان عليه قبل الاختبار، بحيث لا تؤثر الاختبارات على المتغيرات العامة.جري shortcode_exists() بعد الانتهاء من الاختبارات سوف يقدم تقريرا true.)

PHPUnit لديها backupGlobals الإعداد، وتعيينه على false سيمنع PHPUnit من لمس النطاق العالمي.وهذا يجب أن يحل مشكلاتك.لكن....

طريقة أكثر من ممتازة

كمؤلف هذا البرنامج التعليمي, ، أود أن أوصيك بإعداد اختباراتك كما أعرضها هناك.والسبب هو أنك لن تضطر إلى كتابة كل هذا التمهيد حتى تتمكن PHPUnit من اللعب مع WordPress.يجب عليك بدلاً من ذلك استخدام PHPUnit bootstrap الخاص بـ WordPress، والذي من الواضح أنه تم تصميمه بالفعل ليعمل بشكل جيد مع WordPress.:-)

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