web-dev-qa-db-fra.com

Est-il possible de faire une requête admin-ajax sans utiliser die ()?

À peu près ce que le titre dit.

J'ai un plugin personnalisé écrit, qui repose sur l'utilisation de admin-ajax pour gérer diverses formes et actions. Cela fonctionne très bien, cependant, étant donné que les différentes fonctions font écho aux réponses, je dois lancer un die () après la fonction écho. c'est à dire:

echo $return_string;
die();

Tout va bien, mais malheureusement, cela brise mes tests PHPUnit, car jeter dans un die () tuerait le script et empêcherait le test unitaire de fonctionner. Sans le dé, je reçois le 0 traditionnel à la fin de ma réponse, ce qui n'est pas ce que je veux. J'ai également essayé le WP recommandé:

wp_die();

Quelqu'un at-il des idées sur la façon de contourner cela?

2
rich

Si vous utilisez wp_die(), vous pouvez utiliser les outils fournis avec la suite de tests PHPUnit de WordPress. Le WP_Ajax_UnitTestCase fournit la méthode _handleAjax() qui rattache les actions appelées par wp_die() et lève une exception, ce qui empêche l'appel de die(). J'ai écrit un didacticiel sur l'utilisation de WP_Ajax_UnitTestCase , qui explique toutes les fonctionnalités fournies, mais voici un exemple élémentaire:

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

Notez que techniquement, il s'agit d'un test d'intégration plutôt que d'un test unitaire, car il teste une section complète de la fonctionnalité du rappel, et non pas une seule unité. C'est comme cela que WordPress le fait, mais en fonction de la complexité du code de votre rappel, vous pouvez également créer de véritables tests unitaires, en sous-tendant probablement des parties dans d'autres fonctions que vous pouvez simuler.

6
J.D.

Malheureusement, le gestionnaire de hook ajax doit die, sinon wordpress continuera à s'exécuter et d'autres sorties pourraient être générées (ou non, mais vous ne voulez pas vous en fier).

La solution consiste probablement à isoler le code de génération de votre réponse dans une fonction et à tester le résultat généré, puis sur le gestionnaire de hook lui-même.

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

Ensuite, dans vos tests unitaires, vous testez uniquement echo_fn().

3
Mark Kaplun