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

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

[Файл изменился с тех пор, как я впервые опубликовал это...]

РЕДАКТИРОВАТЬ:Хорошо, я следовал уроку Джей Ди как можно точнее.Ощущается Действительно закрывать.Теперь я получаю эту ошибку:

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.Вместо этого вам следует просто использовать загрузочную загрузку WordPress PHPUnit, которая, очевидно, уже спроектирована для работы с WordPress.:-)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top