web-dev-qa-db-fra.com

Plug-in Unit Test pour la création de tables et d'options

J'ai commencé à intégrer des tests unitaires dans ma construction. J'ai une classe qui crée une table de base de données et une option de version de base de données.

Je ne sais pas comment tester si la table et l'option sont en cours de création. Voici la classe

class Safety_links_Create_Database {

    public function __construct() {
        $this->create_db();
    }

    /**
     * Get the databse version
     * @return string the databse version
     */
    public function get_db_version() {
        $database_version = SAFETY_LINKS_DB_VERSION;
        return $database_version;
    }


    public function get_table_name() {
        $table_name = SAFETY_LINKS_DB_TABLE_NAME;
        return $table_name;
    }

    public function get_db_option_name() {
        $option_name = SAFETY_LINKS_DB_OPTION_NAME;
        return $option_name;
    }

    public function get_charset() {
        $charset = SAFETY_LINKS_DB_CHARSET_NAME;
        return $charset;
    }

    public function check_table_name() {
        $table_name = $this->get_table_name();
        $check_name = $GLOBALS['wpdb']->get_var("show tables like '$table_name'");
        if( $check_name != $table_name ) {
            return true;
        } 
        return false;
    }

    public function create_db() {
        global $wpdb;
        $table_name = $this->get_table_name();
        $charset =  $this->get_charset();

        if( $wpdb->get_var( "SHOW TABLES LIKE '$table_name'" ) != $table_name ) {
            $sql = "CREATE TABLE $table_name (
                id mediumint(9) NOT NULL AUTO_INCREMENT,
                ulr VARCHAR(2083) NOT NULL,
                code smallint(3) NOT NULL,
                body tinytext NOT NULL,
                date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
                UNIQUE KEY id (id)
            ) $charset;";

            require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
            dbDelta($sql);
            if( !get_option( $this->get_db_option_name() ) ) {
                add_option( $this->get_db_option_name(), $this->get_db_version() );
            }
        }
    }
} 

Comme je l'ai dit, je ne suis pas sûr de savoir comment construire un test pour cela ou si cela doit même être testé.

6
gilgimech

Devriez-vous tester cela?Yes.

Comment devriez-vous tester cela?Cela dépend.

Il existe plusieurs approches différentes pour le test unitaire des plugins WordPress. Le celui que je préfère et que je connais le mieux est plus comme un test d’intégration . Je ne saurais dire dans votre message si vous utilisez cette approche ou non, mais je vous répondrai dans cette perspective.

Pour mes propres plugins, j'ai créé un cas de test de base qui vous aidera à faire cela . Il vous permet de tester l’installation, ainsi que la désinstallation, et fournit quelques assertions personnalisées que vous jugerez probablement utiles.

Du readme:

Le but de ce test est de vous permettre de rendre les tests de désinstallation de plug-in aussi réalistes que possible. WordPress désinstalle les plugins lorsqu'ils ne sont pas actifs et ces outils vous permettent de simuler cela. L'installation étant effectuée à distance, le plug-in n'est pas chargé lors de l'exécution des tests.

J'ai créé ces outils après avoir constaté une erreur fatale dans l'un des scripts de désinstallation de mon plug-in. Non pas que je n'ai pas eu de tests unitaires pour la désinstallation. J'ai fait. Mais les tests de désinstallation étaient en cours d’exécution avec le plugin déjà chargé. Donc, je n'ai jamais réalisé que j'appelais une fonction du plugin qui ne serait normalement pas disponible. C'est alors que j'ai décidé de créer ces outils de test. Par conséquent, mes tests de désinstallation échoueraient si je n'incluais pas toutes les dépendances requises dans le script de désinstallation de mon plug-in.

En plus de fournir un environnement de test de désinstallation réaliste, il fournit également certaines assertions pour vous aider à vous assurer que votre plug-in a entièrement nettoyé la base de données.

Une partie d'un exemple de test, également issue du fichier Lisez-moi:

    /**
     * Test installation and uninstallation.
     */
    public function test_uninstall() {

        /*
         * First test that the plugin installed itself properly.
         */

        // Check that a database table was added.
        $this->assertTableExists( $wpdb->prefix . 'myplugin_table' );

        // Check that an option was added to the database.
        $this->assertEquals( 'default', get_option( 'myplugin_option' ) );

        /*
         * Now, test that it uninstalls itself properly.
         */

        // You must call this to perform uninstallation.
        $this->uninstall();

        // Check that the table was deleted.
        $this->assertTableNotExists( $wpdb->prefix . 'myplugin_table' );

        // Check that all options with a prefix was deleted.
        $this->assertNoOptionsWithPrefix( 'myplugin' );

        // Same for usermeta and comment meta.
        $this->assertNoUserMetaWithPrefix( 'myplugin' );
        $this->assertNoCommentMetaWithPrefix( 'myplugin' );
    }

Edit(jeu. 22 janvier 2015 15:28):

Même si vous ne voulez pas faire tout votre possible et adopter pleinement cette approche, vous pouvez probablement toujours y trouver quelques éléments utiles qui vous donneront une idée de ce qui est nécessaire pour tester la création de tables, etc.

5
J.D.