使用单元测试的插件开发

时间:2013-04-08 作者:Brian Barnes

我的插件所做的一件事是创建许多SQL表作为版本控制函数的一部分(这是在admin\\u init hook下运行的,因为我找不到更好的wordpress操作方式)。我将初始化脚本作为设置例程的一部分调用,理论上应该作为拆卸例程的一部分删除。

本质上,这里是我(未成功)所做工作的基本存根:

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\'));
}
}
下拉功能似乎正在执行,但下拉表不起作用(它们在单元测试完成后仍然存在)。

我的第一个想法是,测试是异步执行的,但我的调试表明情况并非如此。

有没有更好的方法来处理插件升级(关于数据库更改)或者我遗漏了什么?

2 个回复
最合适的回答,由SO网友:J.D. 整理而成

单元测试转换所有CREATE TABLEDROP TABLE 查询到CREATE TEMPORARY TABLEDROP TEMPORARY TALBE, 分别地所以在你的tearDown 查询将尝试删除具有这些名称的临时表,但不会删除实际的表。要解决此问题,请在DROP 查询:

remove_filter( \'query\', array( $this, \'_drop_temporary_tables\' ) );
您可能还需要在CREATE TABLE 查询:

remove_filter( \'dbdelta_create_queries\', array( $this, \'_create_temporary_tables\' ) );
TheWP_UnitTestCase::_create_temporary_tables() 函数是过滤查询以使表成为临时表的函数。它添加在setUp(), 并在tearDown().

更新:

_create_temporary_tables() 函数现在连接到\'query\' 过滤器,而不是\'dbdelta_create_queries\'. 看见changeset 27041. 因此,现在要删除它,请执行以下操作:

remove_filter( \'query\', array( $this, \'_create_temporary_tables\' ) );

SO网友:Fabien Quatravaux

您是否尝试手动执行SQL语句?您可能会看到一条错误消息,阻止执行table DROP命令(如权限不足)。

通常,SQL表的创建是在activation hook SQL表出现deactivation hook.

是的,WPa mechanism 根据插件版本号自动更新表结构。

结束

相关推荐

Add Column to Term Database

目前,术语数据库有四列。term_id name slug term_group. 我想添加另一个名为menu_order.我该怎么做?我想要的结果是能够订购我的自定义条款。如果有人知道更好的方法,请告诉我。到目前为止,我已经有了设置输入框的代码。我只是需要帮助,试着用get_terms() 作用add_action ( \'section_edit_form_fields\', \'create_section_menu_order\'); function create_section_men