WP_Ajax_UnitTestCase no lanza WPAjaxDieStopException

4 minutos de lectura

avatar de usuario
jplus2

Ok, estoy probando mis devoluciones de llamada ajax para mi complemento de wordpress. Así que básicamente seguí las instrucciones aquí.
https://codesymphony.co/wp-ajax-plugin-unidad-prueba/

Aquí está mi función de devolución de llamada 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();

}

aquí está mi prueba

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 );

  }

}

Ahora aquí están los problemas

  1. No arroja la excepción WPAjaxDieStopException como se supone que

cuando hago este codigo $this->setExpectedException( 'WPAjaxDieStopException' );
no pasa la prueba https://snag.gy/JSTqHV.jpg

  1. Imprime que se ha activado wp_die(), por lo que este código

$response = $this->_last_response;
var_dump( $response );

imprime esto

https://snag.gy/pKqfUk.jpg

El número 2 es un problema porque no puedes hacer json_decode la cadena salió porque es una cadena json no válida, por lo que no puedo continuar con mi prueba.

Estoy comenzando con las pruebas automatizadas en los complementos de wordpress y agradezco cualquier ayuda.

Nota: mi devolución de llamada ajax funciona bien en mi complemento en vivo, incluso si uso wp_die (), solo imprime esa extraña cadena ‘wp_die llamado …’ en mi prueba.

Mi versión de php es 5.6.21 y mi versión de phpunit es 4.8.26


Aquí hay información adicional

Por lo tanto, tanto ‘WPAjaxDieStopException’ como ‘WPAjaxDieContinueException’ no se lanzan,

sin embargo, lo interesante es cuando hago esto

$this->_setRole( 'administrator' );

me sale este error en la consola

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

Pero claramente estoy extendiendo WP_Ajax_UnitTestCase y tiene el método _setRole
https://core.trac.wordpress.org/browser/trunk/tests/phpunit/includes/testcase-ajax.php#L168

Además, cuando ejecuto phpunit, recibo este montón de errores o advertencias en la consola.

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

También estoy usando vagabundo y uso http://vccw.cc/ para mi dev env y también siguiendo esta guía sobre cómo agregar pruebas para extensiones de woocommerce
https://github.com/Automattic/wc-extensions-code-test-guide

Espero que toda esta información adicional ayude a resolver finalmente este problema.

  • ¿Ha intentado agregar $this->assertEquals(..); o $this->assertTrue( isset( $e ) ); inmediatamente después del intento de captura? porque es posible que reciba algún resultado que dice el manual.

    – Oooogi

    14 de junio de 2016 a las 8:58


  • no tengo idea de esto 🙁

    – skzac

    14 de junio de 2016 a las 10:23

  • @Oooogi no hay suerte, $this->assertTrue( isset( $e ) ); falla la prueba, no se lanza ninguna excepción.

    – Jplus2

    14/06/2016 a las 11:20

  • ¿Puede intentar poner: add_action (‘wp_ajax_my_plugin_get_site_pages’, array ($ this, ‘my_plugin_get_site_pages’)); en lugar de lo que escribiste y verificaste?

    – Oooogi

    14 de junio de 2016 a las 11:52


  • @Oooogi, sí, ya lo hice, sin suerte.

    – Jplus2

    14 de junio de 2016 a las 12:18

Estuve fuera por un tiempo, estuve muy ocupado, finalmente tuve algo de tiempo para resolver esto. Resulta que es un error estúpido (facepalm).

Ya que estamos usando WP_Ajax_UnitTestCase que extiende WP_UnitTestCase

Luego, cuando usamos la configuración de la función en WP_Ajax_UnitTestCase, debemos llamar a esto parent::setup();

public function setup() {
    parent::setup();
    // your init codes here
}

No estaba llamando eso en mi código existente, por eso la prueba está actuando de manera extraña. Agregar eso resuelve todos los problemas extraños y ejecuta la prueba como se esperaba y genera las excepciones necesarias.

WPAjaxDieStopException se lanza si la función de devolución de llamada ajax no produce ningún resultado.

WPAjaxDieContinueException se lanza si la devolución de llamada ajax produce algún resultado.

También asegúrese de usar wp_die() en vez de die() en su devolución de llamada ajax, si usa la última, la prueba se detendrá.

Estoy planeando escribir una guía extensa para hacer pruebas automatizadas en los complementos de WordPress, pronto pondré el enlace aquí.

Por ahora espero que esto ayude a alguien.

¿Ha sido útil esta solución?