web-dev-qa-db-ja.com

PHPUnitテストプラグインの有効化

私のプラグインがPHPUnitで正しく起動するかどうかをテストしています。私はこの サイト で生成された定型構造を使用し、このテストを追加しました:

class PluginTest extends WP_UnitTestCase {

  function test_plugin_activation() {    
    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
    $result = activate_plugin( WP_CONTENT_DIR . '/plugins/example-plugin/example-plugin.php', '', TRUE, FALSE );
    $this->assertNotWPError( $result );
  }
}

しかし、私はこのエラーが出ます:

1) PluginTest::test_plugin_activation
Plugin file does not exist.
Failed asserting that WP_Error Object (...) is not an instance of class "WP_Error".

私は手動でチェックしました、そして私はWordpressの管理者パネルを通してプラグインを有効にしたり無効にしたりすることができます。

1
GeekDaddy

WP_UnitTestCaseでは既にbootstrap.phpとしてプラグインをロードしているので、実際にはmu-pluginを使ってプラグインをアクティブにすることはできません。

私はあなたのプラグインのアクティベーションをテストするためにあなたが提案することができます:do_action('activate_' . FULL_ABSPATH_TO_YOUR_PLUGIN_PHP)を呼び出す、ここでFULL_ABSPATH_TO_YOUR_PLUGIN_PHPは以下のようになります:var/www/html/wordpress/wp-content/plugins/hello-world/hello-world.php

この例では、hello-worldプラグインは、指定されたユーザーの起動時の機能を取り消します。

class ActivationEventTest extends WP_UnitTestCase {

    const PLUGIN_BASENAME = 'var/www/html/wordpress/wp-content/plugins/hello-world/hello-world.php';

    public function testActivateWithSupport() {
        $this->factory()->user->create( [
            'user_email' => '[email protected]',
            'user_pass'  => 'reallyheavypasword',
            'user_login' => 'hello',
            'user_role'  => 4,
            'role'       => 4
        ] );

        do_action( 'activate_' . static::PLUGIN_BASENAME );

        $user = get_user_by( 'login', 'hello' );
        $this->assertEmpty( $user->caps );
        $this->assertEmpty( $user->roles );
    }
}
2
ocReaper

コアWordPressテストスイートを使ったプラグインの有効化/インストールおよびアンインストールのテストは、 これらの追加のユーティリティ を使用するとより簡単かつ適切に実行できます。彼らの主な焦点はアンインストールのテストですが、彼らは同様にアクティベーション/インストールをテストします。これはそこからのサンプルテストケースで、どのようにインストールとアンインストールをテストするかを示しています:

<?php

/**
 * Test uninstallation.
 */

/**
 * Plugin uninstall test case.
 *
 * Be sure to add "@group uninstall", so that the test will run only as part of the
 * uninstall group.
 *
 * @group uninstall
 */
class My_Plugin_Uninstall_Test extends WP_Plugin_Uninstall_UnitTestCase {

    //
    // Protected properties.
    //

    /**
     * The full path to the main plugin file.
     *
     * @type string $plugin_file
     */
    protected $plugin_file;

    //
    // Public methods.
    //

    /**
     * Set up for the tests.
     */
    public function setUp() {

        // You must set the path to your plugin here.
        $this->plugin_file = dirname( dirname( __FILE__ ) ) . '/myplugin.php';

        // Don't forget to call the parent's setUp(), or the plugin won't get installed.
        parent::setUp();
    }

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

これはおそらくあなたが達成しようとしていることだと思います。


なぜあなたのテストが失敗するのかということに関しては、私にはわかりません。それをデバッグするには、activate_plugin()のどこでエラーが発生しているのかを確認する必要があります。プラグインファイルのチェックのどの部分が失敗していますか? xdebugのようなツールはこのようなことに非常に貴重です。あなたが使っているPHPビルド用にxdebugがインストールされていない場合(おそらく手に入れるべきでしょう)、activate_plugin()らのソースコードを見て手動でデバッグする必要があります。そして、そのエラーがどこで発生しているのかを確認します。

0
J.D.