web-dev-qa-db-fra.com

Développement de plugins avec tests unitaires

Une des choses que mon plugin fait est de créer un certain nombre de tables SQL dans le cadre d’une fonction de gestion de versions (qui est exécutée sous le hook admin_init car je ne trouvais pas de meilleure façon de faire les choses avec wordpress). J'appelle le script d'initialisation dans le cadre de la routine setUp et devrait théoriquement être abandonné dans le cadre de la routine tearDown.

Voici l'essentiel de ce que je fais (sans succès):

class GFDL_test extends WP_UnitTestCase {
public $plugin_slug = 'gfdl';
protected $users = array();

function setUp() {
    parent::setUp();
    include_once(/* path for gfdl_versioning function*/);
    GFDataLayer::init_globals();
    gfdl_versioning(); /* this creates the tables */

    /* add test users (to give them a role add a 'role' parameter to this add user) */
    $this->users[0] = wp_insert_user(array('user_login' => 'test1'));
    $this->users[1] = wp_insert_user(array('user_login' => 'test2'));
}

function tearDown() {
    global $wpdb;
    /* these lines don't work for some reason */
    $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'gfdl_bullets;');
    $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'gfdl_character_ai;');
    $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'gfdl_items;');
    $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'gfdl_sprites;');
    $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'gfdl_backgrounds;');

    wp_delete_user($this->users[0]);
    wp_delete_user($this->users[1]);
    parent::tearDown();
}

function testDatalayer() {
    $this->assertTrue(class_exists( 'GFDataLayer'));
}

function testVersion() {
    $this->assertEquals('0.11', get_option('gfdl_version'));
}
}

La fonction de démontage semble être en cours d'exécution, mais les tables de suppression ne fonctionnent pas (elles restent après la fin des tests unitaires).

Ma première pensée est que les tests étaient exécutés de manière asynchrone mais mon débogage suggère le contraire.

Existe-t-il un meilleur moyen de gérer les mises à niveau de plug-in (en ce qui concerne les modifications de base de données) ou y a-t-il quelque chose qui me manque?

3
Brian Barnes

Les tests unitaires transforment toutes les requêtes CREATE TABLE et DROP TABLE en CREATE TEMPORARY TABLE et DROP TEMPORARY TALBE, respectivement. Ainsi, dans votre tearDown, la requête tentera de supprimer les tables temporaires portant ces noms, mais pas les tables réelles. Pour résoudre ce problème, ajoutez ceci avant vos requêtes DROP:

remove_filter( 'query', array( $this, '_drop_temporary_tables' ) );

Vous devrez peut-être aussi ajouter ceci avant vos requêtes CREATE TABLE:

remove_filter( 'dbdelta_create_queries', array( $this, '_create_temporary_tables' ) );

La fonction WP_UnitTestCase::_create_temporary_tables() est celle qui filtre les requêtes pour rendre les tables temporaires. Il est ajouté dans la setUp() et supprimé dans la tearDown().

Mettre à jour:

La fonction _create_temporary_tables() est maintenant liée au filtre 'query' au lieu de 'dbdelta_create_queries'. Voir changeset 27041 . Alors maintenant, pour l'enlever, vous feriez:

remove_filter( 'query', array( $this, '_create_temporary_tables' ) );
4
J.D.

Avez-vous essayé d'exécuter les instructions SQL manuellement? Vous pourriez peut-être voir un message d'erreur empêchant la commande DROP de la table de s'exécuter (comme des droits insuffisants).

Normalement, la création des tables SQL s'effectue dans le hook d'activation et les tables SQL dans le hook d'activation .

Et oui, WP possède un mécanisme permettant de mettre à jour automatiquement la structure des tables en fonction du numéro de version du plug-in.

1
Fabien Quatravaux