web-dev-qa-db-ja.com

ユニットテストによるプラグイン開発

私のプラグインがすることの1つは、バージョン管理関数の一部としていくつかのSQLテーブルを作成することです(これは私がより良いワードプレスの方法を見つけることができなかったのでadmin_initフックの下で実行されます)。初期化スクリプトはsetUpルーチンの一部として呼び出します。理論的にはtearDownルーチンの一部として削除する必要があります。

本質的にここに私が(失敗した)やっていることの基本的なスタブがあります:

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

ティアダウン機能は実行されているように見えますが、ドロップテーブルは機能していません(ユニットテストが終了した後も残ります)。

私の最初の考えはテストが非同期的に実行されていたことですが、私のデバッグはそうでないことを示唆しています。

(データベースの変更に関して)プラグインのアップグレードを処理するためのより良い方法はありますか、それとも私が見逃しているものがありますか?

3
Brian Barnes

単体テストは、すべてのCREATE TABLEおよびDROP TABLEクエリをそれぞれCREATE TEMPORARY TABLEおよびDROP TEMPORARY TALBEに変換します。そのため、あなたのtearDownでは、クエリはそれらの名前の一時テーブルを削除しようとしますが、実際のテーブルは削除しません。これを修正するには、DROPクエリの前にこれを追加します。

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

CREATE TABLEクエリの前にこれを追加する必要があるかもしれません:

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

WP_UnitTestCase::_create_temporary_tables()関数は、クエリをフィルタリングしてテーブルを一時的にするものです。これはsetUp()に追加され、tearDown()から削除されます。

更新:

_create_temporary_tables()関数は、'query'ではなく'dbdelta_create_queries'フィルタにフックされるようになりました。 changeset 27041 を参照してください。だから今それを削除するにはあなたがするだろう:

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

手動でSQLステートメントを実行しようとしましたか?おそらく、テーブルDROPコマンドの実行を妨げるエラーメッセージが表示されるでしょう(不十分な権限など)。

通常、SQLテーブルの作成は activationフック に行われ、SQLテーブルは deactivationフック にドロップされます。

そして、はい、WPは メカニズム を持ち、プラグインのバージョン番号に基づいて自動的にテーブル構造を更新します。

1