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

  1. Он выводит, что 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, я скоро поставлю ссылку на него.

В настоящее время я надеюсь, что это поможет любому.