web-dev-qa-db-ja.com

テーブルとオプション作成のためのプラグインユニットテスト

私は自分のビルドに単体テストを取り入れ始めました。データベーステーブルとデータベースバージョンオプションを作成するクラスがあります。

テーブルとオプションが作成されているかどうかをテストする方法がわかりません。これがクラスです

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

私が言ったように、私はこれのためにどうやってテストを構築するか、あるいはこれさえテストする必要があるかどうかわからない。

6
gilgimech

これをテストしますか?はい。

これをどのようにテストすればいいですか?それは異なります。

WordPressプラグインを単体テストするにはいくつかの異なる方法があります。私が好んでよく知っている ものは、統合テスト のようなものです。あなたがこのアプローチを使っているかどうか私はあなたの投稿からはわかりませんが、とにかくこの観点から答えます。

私自身のプラグインのために、私はあなたがこれをするのを助ける基本テストケースを作成しました。インストールとアンインストールもテストしましょう。そして、おそらく役に立つと思われるカスタムアサーションをいくつか提供します。

Readmeから:

このテストケースの目的は、プラグインのアンインストールテストを可能な限り現実的なものにすることです。 WordPressはプラグインがアクティブでないときにそれらをアンインストールします、そしてこれらのツールはそれをシミュレートすることを可能にします。インストールはリモートで実行されるため、テストの実行時にプラグインはロードされません。

私のプラグインのアンインストールスクリプトの1つに致命的なエラーがあることを発見した後、私はこれらのツールを作成しました。私はアンインストールのための単体テストを持っていなかったというわけではありません。やった。しかし、アンインストールテストはすでにロードされているプラ​​グインで実行されていました。だから私は普段は利用できないだろうプラグインの関数の1つを呼んでいることに気づかなかった。そこで私はこれらのテストツールを作成することにしたので、プラグインのアンインストールスクリプトに必要な依存関係がすべて含まれていなければ、アンインストールテストは失敗します。

現実的なアンインストールテスト環境を提供することに加えて、プラグインがデータベースを完全にクリーンアップしたことを確認するのに役立つアサーションも提供します。

これもreadmeからのサンプルテストケースの一部です。

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

編集(Thu Jan 22 2015 15:28 PM):

このアプローチを全面的に採用したくない場合でも、おそらくテーブル作成などのテストに必要な情報がいくつかあるので、そこに役立つ情報を見つけることができます。

5
J.D.