私のプラグインがすることの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'));
}
}
ティアダウン機能は実行されているように見えますが、ドロップテーブルは機能していません(ユニットテストが終了した後も残ります)。
私の最初の考えはテストが非同期的に実行されていたことですが、私のデバッグはそうでないことを示唆しています。
(データベースの変更に関して)プラグインのアップグレードを処理するためのより良い方法はありますか、それとも私が見逃しているものがありますか?
単体テストは、すべての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' ) );
手動でSQLステートメントを実行しようとしましたか?おそらく、テーブルDROPコマンドの実行を妨げるエラーメッセージが表示されるでしょう(不十分な権限など)。
通常、SQLテーブルの作成は activationフック に行われ、SQLテーブルは deactivationフック にドロップされます。
そして、はい、WPは メカニズム を持ち、プラグインのバージョン番号に基づいて自動的にテーブル構造を更新します。