¿Hay alguna forma de hacer una solicitud de administrador-ajax sin el uso de die ()?

2

Más o menos lo que dice el título.

Tengo un complemento personalizado escrito, que se basa en el uso de admin-ajax para manejar varias formas y acciones. Todo está funcionando bien, sin embargo, como las diversas funciones responden con eco, tengo que lanzar un dado () después de la función de eco. es decir:

echo $return_string;
die();

Todo bien, sin embargo, desafortunadamente esto rompe mis pruebas de PHPUnit, ya que lanzar un dado () matará el guión e impedirá que la prueba de unidad funcione. Sin el dado, recibo el 0 tradicional al final de mi respuesta, que no es lo que quiero. También he probado el WP recomendado:

wp_die();

¿Alguien tiene alguna idea sobre cómo solucionar esto?

    
pregunta rich 18.04.2017 - 18:59

2 respuestas

5

Si usa wp_die() , puede utilizar las herramientas incluidas con el conjunto de pruebas PHPUnit de WordPress. WP_Ajax_UnitTestCase proporciona el método _handleAjax() que se enganchará en las acciones llamadas por wp_die() y lanzará una excepción, lo que evitará que se llame a die() . He escrito un tutorial sobre cómo usar WP_Ajax_UnitTestCase , que explica todas las características que proporciona, pero aquí hay un ejemplo básico:

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

Tenga en cuenta que, técnicamente, se trata de pruebas de integración en lugar de pruebas unitarias, ya que comprueba una sección completa de la funcionalidad de devolución de llamada, no solo una unidad. Así es como lo hace WordPress, pero dependiendo de la complejidad del código de su devolución de llamada, es posible que también desee crear verdaderas pruebas unitarias para él, y probablemente abstraiga partes de él en otras funciones que pueda simular.

    
respondido por el J.D. 18.04.2017 - 22:20
3

Desafortunadamente, el controlador de enganche ajax tiene que ser die ; de lo contrario, wordpress continuará ejecutándose y es posible que se genere más salida (o no, pero no desea confiar en ello).

Probablemente, la solución es aislar el código de generación de respuesta en una función y probar la salida que genera, y luego, en el controlador de gancho, simplemente hágalo

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

Luego, en tus pruebas unitarias, solo pruebas echo_fn() .

    
respondido por el Mark Kaplun 18.04.2017 - 19:58

Lea otras preguntas en las etiquetas