WP_Ajax_UnitTestCase не бросает WPAjaxDieStopException
Хорошо, поэтому я тестирую свои обратные вызовы ajax для своего плагина wordpress.
Поэтому я в основном следовал инструкциям здесь
https://codesymphony.co/wp-ajax-plugin-unit-testing/
Вот моя функция обратного вызова ajax
public function my_plugin_get_site_pages( $args = null ) {
//...... Processing $site_pages.....
$response = array(
'status' => 'success',
'site_pages' => $site_pages
);
@header( 'Content-Type: application/json; charset=' . get_option( 'blog_charset' ) );
echo wp_json_encode( $response );
wp_die();
}
Вот мой тест
class My_Plugin_Ajax_Test extends WP_Ajax_UnitTestCase {
private $_foo;
public function setup() {
//.....Initialize $_foo here...
}
public function test_foo() {
try {
$_POST[ 'args' ] = array( 'return_format' => 'raw' );
add_action( 'wp_ajax_my_plugin_get_site_pages' , array( $this->_foo , 'my_plugin_get_site_pages' ) );
//$this->setExpectedException( 'WPAjaxDieStopException' );
$this->_handleAjax( 'my_plugin_get_site_pages' );
} catch ( WPAjaxDieStopException $e ) {}
//$response = json_decode( $this->_last_response );
$response = $this->_last_response;
var_dump( $response );
}
}
Теперь вот проблемы
- Это не исключает исключение WPAjaxDieStopException, как его предполагается, чтобы
когда я делаю этот код $this->setExpectedException( 'WPAjaxDieStopException' );
он не прошел тест https://snag.gy/JSTqHV.jpg
- Он выводит, что wp_die() был запущен, поэтому этот код
$response = $this->_last_response;
var_dump( $response );
печатает этот
https://snag.gy/pKqfUk.jpg
Число 2 - проблема, потому что вы не можете сделать json_decode
строку, выводящую coz ее недопустимую строку json, поэтому я не могу продолжить мой тест.
Я только начинаю с автоматического тестирования плагинов Wordpress, и я ценю любую помощь.
Примечание:
Мой обратный вызов ajax работает нормально в моем живом плагине, даже если я использую wp_die(), он просто печатает эту странную строку "wp_die called..." в моем тесте.
Моя версия php - 5.6.21, а моя версия phpunit - 4.8.26
Вот дополнительная информация
Таким образом, оба "WPAjaxDieStopException" и "WPAjaxDieContinueException" не выбрасываются,
однако что интересно, когда я это делаю
$this->_setRole( 'administrator' );
Я получаю эту ошибку на консоли
Trying to get property of non-object
/tmp/wordpress-tests-lib/includes/testcase-ajax.php:151
/vagrant/www/wordpress/wp-content/plugins/my-plugin/tests/test-file.php:30
Но ясно, что я расширяю WP_Ajax_UnitTestCase и имеет метод _setRole
https://core.trac.wordpress.org/browser/trunk/tests/phpunit/includes/testcase-ajax.php#L168
Также, когда я запускаю phpunit, я получаю эту кучу ошибок или предупреждений на консоли
Installing...
Running as single site... To run multisite, use -c tests/phpunit/multisite.xml
WordPress database error Duplicate key name 'location_type_code' for query ALTER TABLE wptests_woocommerce_tax_rate_locations ADD KEY location_type_code (location_type(40),location_code(90)) made by PHPUnit_TextUI_Command::main, PHPUnit_TextUI_Command->run, PHPUnit_TextUI_Command->handleArguments, PHPUnit_TextUI_Command->handleBootstrap, PHPUnit_Util_Fileloader::checkAndLoad, PHPUnit_Util_Fileloader::load, include_once('/vagrant/www/wordpress/wp-content/plugins/my-plugin/tests/bootstrap.php'), require('/tmp/wordpress-tests-lib/includes/bootstrap.php'), require_once('wp-settings.php'), do_action('init'), call_user_func_array, WC_Install::check_version, WC_Install::install, WC_Install::create_tables, dbDelta
Также я использую бродягу и использую http://vccw.cc/ для своего dev env, а также следую этому руководству по добавлению тестов для расширений woocommerce
https://github.com/Automattic/wc-extensions-code-test-guide
Надеюсь, что эта дополнительная информация поможет в решении этой проблемы.
Ответы
Ответ 1
Некоторое время, будучи очень занятым, наконец-то уделило некоторое время понять это. Оказывается, это глупая ошибка (facepalm).
Поскольку мы используем WP_Ajax_UnitTestCase, который расширяет WP_UnitTestCase
Затем, когда мы используем настройку функции в WP_Ajax_UnitTestCase, нам нужно называть это parent::setup();
public function setup() {
parent::setup();
// your init codes here
}
Я не называл это на моем существующем коде, потому что тест действует странно. Добавление, которое решает все странные проблемы и запускает тест, как ожидалось, и генерирует необходимые исключения.
WPAjaxDieStopException вызывается, если функция обратного вызова ajax не дает никакого вывода.
WPAjaxDieContinueException вызывается, если обратный вызов ajax дает любой вывод.
Также не забудьте использовать wp_die()
вместо die()
в вашем обратном вызове ajax, если вы используете позже, тест будет остановлен.
Я планирую написать обширное руководство по автоматическому тестированию в плагинах WordPress, я скоро поставлю ссылку на него.
В настоящее время я надеюсь, что это поможет любому.