Intereting Posts
Несколько изображений с Media Uploader на интерфейсе Как изменить значение $ menu_class в ep_nav_menu? Как префикс post permalinks с / blog / – без влияния на пользовательские типы сообщений? Сортировка объекта $ posts ACF, который уже был отсортирован AddFilter option_active_plugins выполняется 6 раз. Зачем? Различные таксономии slug для двух разных CPT Как добавить теги в страницу подменю или страницу меню Не удается загрузить изображение продукта в панели инструментов поставщика pro с помощью браузера Chrome Способ изменения URL-адресов изображений в сообщении в URL-адрес изображения cdn? Добавить класс в элементы в wp_list_categories () Что запускает уведомление об обновлении плагина Совместное использование базы данных для совместной разработки Я хочу пройти через Woocommerce Product Catogories и показать их в выпадающем меню Редактирование страниц, которые уже были опубликованы Как поймать изображения с пустыми размерами?

Есть ли способ сделать запрос 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() .