用于表和选项创建的插件单元测试

时间:2015-01-22 作者:gilgimech

我已经开始在构建中加入单元测试。我有一个创建数据库表和数据库版本选项的类。

我不知道如何测试是否正在创建表和选项。这是课程

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() );
            }
        }
    }
} 
就像我说的,我不知道如何构建一个测试,或者是否需要测试。

1 个回复
SO网友:J.D.

Should you test this?

How should you test this? 那要看情况而定。

有几种不同的方法可以对WordPress插件进行单元测试。这个one that I prefer and am most familiar with is more like integration testing. 我无法从你的帖子中判断你是否在使用这种方法,但无论如何,我会从这个角度回答。

对于我自己的插件,我创建了a base testcase that will help you do this. 它让您可以测试安装和卸载,并提供一些您可能会发现有用的自定义断言。

自述文件:

这个测试用例的目的是允许您尽可能真实地进行插件卸载测试。WordPress在插件处于非活动状态时卸载插件,这些工具允许您进行模拟。安装是远程执行的,因此在运行测试时不会加载插件。

在发现我的插件卸载脚本中有一个致命错误后,我创建了这些工具。并不是说我没有卸载单元测试。我做到了。但是卸载测试是在插件已经加载的情况下运行的。所以我从来没有意识到我在调用插件的一个函数,而这些函数通常是不可用的。那时候我决定创建这些测试工具,所以如果我没有在插件的卸载脚本中包含所有必需的依赖项,我的卸载测试就会失败。

除了提供真实的卸载测试环境外,它还提供了一些断言,以帮助您确保插件完全清理了数据库。

示例测试用例的一部分,也来自自述:

    /**
     * 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 (2015年1月22日星期四下午3:28):

即使您不想全力以赴完全采用这种方法,您可能仍然可以从中找到一些有用的信息,让您了解测试表创建等所需的内容。

结束

相关推荐

必须使用插件自动加载器:如何正确使用get_plugins()?

我的autoloader类负责加载必须使用的插件,这些插件不位于mu-plugins 文件夹要定位它们,我需要使用get_plugins() 作用According to Codex, 该函数接受一个参数:$plugin\\u folder(string)(可选):单个插件文件夹的相对路径。我的文件层次结构如下所示:|-- /mu-plugins | |-- autoload.php // only includes wpmu/autoload.php&#