Функция WordPress дает разные результаты вне vs внутри теста PHPUnit

Я очень старался заставить 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 возвращает true, тогда как в тестовом случае тот же самый оператор shortcode_exists возвращает false. Что я делаю не так?

Вот содержимое всего тестового файла:

[Файл изменился с тех пор, как я изначально разместил это …]

EDIT: Хорошо, поэтому я внимательно следил за учебником JD. Он чувствует себя очень близко. Я получаю эту ошибку:

 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} 

Любая идея, как я могу это исправить? Тем временем я буду продолжать проверять все пути к файлу, которые я определил в нескольких файлах конфигурации.

EDIT EDIT: эта последняя ошибка была решена путем изменения конфигурации 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 от WordPress, которая, очевидно, уже разработана для игры с WordPress. 🙂