Intereting Posts
Получить пользователей, которым нравится сообщение Сохранять и изменять переменную сеанса – PHP SESSION VARIABLE изменить URL-адрес в wordpress как добавить префикс только для публикации url structor Задайте значение настраиваемого поля при публикации или обновлении публикации WP Gallery отображает заголовок вместо заголовка Восстановление поврежденного блога WordPress Сброс сгенерированного файла wp-config.php с помощью wp-cli Список дочерних страниц родительской страницы родителей (дочерние страницы от грандиозного родителя) Создание фиксированных размеров изображений для разных страниц, исключение размеров при загрузке таксономический запрос для вывода пули вместо идентификаторов Локализация плагина WordPress NavXT Поместите изображение на заголовок Использование темы стартера и стартовой темы с детской темой Используйте страницу wordpress для отображения определенной категории

Есть ли способ сделать запрос admin-ajax без использования die ()?

Довольно многое, что говорится в названии.

У меня есть настраиваемый плагин, который опирается на использование admin-ajax для обработки различных форм и действий. Это все работает нормально, однако, поскольку различные функции откликаются на ответы, я должен выбросить die () после функции эха. то есть:

echo $return_string; die(); 

Все в порядке, однако, к сожалению, мои тесты PHPUnit, как бросание в die (), убьют скрипт и не позволят модульному тесту работать. Без смерти я получаю традиционное 0 в конце моего ответа, чего я не хочу. Попробовали также рекомендацию WP:

 wp_die(); 

Кто-нибудь есть идеи о том, как обойти это?

Solutions Collecting From Web of "Есть ли способ сделать запрос admin-ajax без использования die ()?"

Если вы используете wp_die() вы можете использовать инструменты, включенные в набор тестов PHPUnit WordPress. WP_Ajax_UnitTestCase предоставляет метод _handleAjax() который будет подключаться к действиям, вызванным wp_die() и wp_die() исключение, которое предотвратит вызов функции die() . Я написал учебное пособие по использованию WP_Ajax_UnitTestCase , в котором объясняются все функции, которые он предоставляет, но вот базовый пример:

 class My_Ajax_Test extends WP_Ajax_UnitTestCase { public function test_some_option_is_saved() { // Fulfill requirements of the callback here... $_POST['_wpnonce'] = wp_create_nonce( 'my_nonce' ); $_POST['option_value'] = 'yes'; try { $this->_handleAjax( 'my_ajax_action' ); } catch ( WPAjaxDieStopException $e ) { // We expected this, do nothing. } // Check that the exception was thrown. $this->assertTrue( isset( $e ) ); // Check that the callback did whatever it is expected to do... $this->assertEquals( 'yes', get_option( 'some_option' ) ); } } 

Обратите внимание, что технически это интеграционное тестирование, а не модульное тестирование, поскольку оно проверяет полное поперечное сечение функциональности обратного вызова, а не только одну единицу. Так WordPress это делает, но в зависимости от сложности кода вашего обратного вызова вы также можете создать для него истинные модульные тесты, возможно, абстрагируя его часть на другие функции, которые вы можете издеваться.

К сожалению, обработчик крючка ajax должен die иначе wordpress будет продолжать работать, и может быть сгенерирован еще один вывод (или может не быть, но вы не хотите полагаться на него).

Возможно, решение состоит в том, чтобы изолировать ваш код генерации ответа в функции и протестировать вывод, который он генерирует, а затем непосредственно на обработчике крючков

 echo echo_fn(....); wp_die() 

Затем в ваших модульных тестах вы проверяете только echo_fn() .