web-dev-qa-db-fra.com

Lorsque l'unité teste un plug-in, le plug-in doit-il figurer dans le répertoire wp-content/plugins de l'installation des tests WordPress?

Je suis en train de configurer des tests unitaires pour mon plugin. Dans mon fichier tests/phpunit/bootstrap.php, j'ai:

require_once $wp_tests_dir . '/includes/functions.php';

    tests_add_filter( 'muplugins_loaded', function() {
        require /can/this/be/anywhere/on/my/filesystem/myplugin/myplugin.php
    } );

// Start up the WP testing environment
require_once $wp_tests_dir . '/includes/bootstrap.php';

Comme vous pouvez le constater, le fichier principal de mon plug-in doit être inséré dans une fonction liée à muplugins_loaded avant de démarrer l'environnement de test WP.

Ma question

Myplugin/myplugin.php doit-il figurer dans le répertoire wp-content/plugins de l'installation des tests WordPress ou peut-il être situé n'importe où sur mon système de fichiers?

6
henrywright

TL; DR

Il peut être n'importe où sur le système de fichiers.

(Mais consultez la mise à jour ci-dessous pour un outil qui vous aidera à le faire de manière encore plus réaliste.)

Explication

Le plug-in peut être n'importe où sur le système de fichiers, selon que votre plug-in dispose d'une fonction d'installation et de la manière dont vous souhaitez l'exécuter.

Si votre plug-in crée des tables de base de données ou enregistre les options par défaut dans la base de données lors de l'activation, le chargement de votre plug-in de cette manière ne fera pas installer votre plug-in et ne fonctionnera donc probablement pas correctement. Donc, en plus de charger le plugin, vous devez également l'installer.

Pour ce faire, WordPress utilise la fonction activate_plugin(), qui appelle le hook d’activation du plug-in enregistré avec register_activation_hook().

Cependant, activate_plugin() confirme que le plug-in existe dans le dossier wp-content/plugins. Par conséquent, si vous installez le plug-in de cette manière, vous devrez en avoir réellement (ou un lien symbolique vers celui-ci) dans le répertoire plugins.

C'est une douleur, donc je n'utilise généralement pas activate_plugin() pour installer le plugin. Au lieu de cela, j'appelle directement la fonction que vous avez enregistrée auprès de register_activation_hook(). Cela peut ne pas être idéal, mais je n’ai pas eu d’effets secondaires indésirables.

Donc, vous auriez quelque chose comme ça:

tests_add_filter( 'muplugins_loaded', function() {
    require '/path/to/plugin/anywhere/on/filesystem/myplugin/myplugin.php'

    my_plugin_install_function();
} );

Bien sûr, si votre plugin n’a pas de fonction d’installation, ce point est sans objet et vous n’aurez probablement pas à vous soucier de l’activation/installation du plugin. Il suffit de le charger de n'importe où sur le système de fichiers et vos tests devraient fonctionner correctement.

Tests WebDriver

Notez qu'il peut arriver (probablement devrait ) que vous souhaitiez exécuter des tests d'acceptation pour votre plugin. Selon la façon dont vous décidez de le faire, vous devrez activer votre plug-in sur le site visité par le navigateur WebDriver.

WP Navigateur offre plusieurs options pour le faire avec PHPUnit via Codeception. Aucune des options qu’il offre actuellement ne charge réellement le plug-in du côté des tests en plus du côté client/distant, de sorte que le site utilisé dans les tests WebDriver est complètement découplé de celui utilisé dans les tests unitaires. (Cependant, je suis actuellement travaillant sur une approche hybride } qui utilise le même site et se charge du côté des tests lors de l'exécution des tests de WebDriver.)

Mise à jour novembre 2016

Bien que tout ce que j'ai dit ci-dessus soit toujours vrai et que le chargement du plug-in de cette manière n'ait posé aucun problème, j'ai récemment décidé de rechercher un réalisme plus réaliste quant à la manière dont le plug-in est chargé et installé pendant les tests unitaires. À cette fin, j'ai créé une petite bibliothèque appelée WPPPB , ou le plug-in WordPress Plugin PHPUnit Bootstrap. Lors de son utilisation, le chargement de votre plugin est aussi simple que cela:

$loader = WPPPB_Loader::instance();
$loader->add_plugin( 'my-plugin/my-plugin.php' );
$loader->load_wordpress();

C'est d'une simplicité trompeuse, car en coulisse, le plugin est activé à distance , avant le chargement de WordPress, de sorte qu'il puisse ensuite être chargé par WordPress exactement comme il le ferait normalement "dans la vie réelle". Cela nécessite que vous ayez un lien symbolique vers le plugin dans le dossier plugins, mais la bibliothèque inclut un script qui configurera tout pour vous automatiquement. (Astuce: WPPPB inclut également des outils pour vous aider à tester de manière très réaliste les plug-in/installation.)

6
J.D.