web-dev-qa-db-ja.com

アクションフックによって呼び出されるメソッドを正しいテストする方法

私のクラスのコンストラクタは 'init'アクションフックにアクションを追加します。

class My_Custom_Post_Type {

    function __construct( $type ) {
        $this->type = $type;
        add_action( 'init', array( $this, 'register_my_type' );
    }

    function register_my_type() {
        register_post_type( $this->type);
    } 
}    

私は単体テストでこれをテストしようとしていましたが、ようやく 'init'アクションフックが起動する理由がないことに気づきました。 register_my_typeメソッドが呼び出されていること、および新しい投稿タイプが登録されていることをテストする方法はありますか?

編集する

私の混乱の主な原因は、phpunit、WordPressテストスイート、私のクラスコード、そして私のテストコードの間の関係を理解し​​ていないことから来ました。

私が今理解しているのは、 このチュートリアル または WP-CLI によって提案されている方法でインストールされたWordPress開発者ツールで、phpunitを呼び出すとブートストラップファイルがロードされるmuplugins_loadedアクションフックへのプラグイン。その後、ブートストラップファイルはWordPressテスト環境をロードします。 WordPressがロードを終えた後にinitフックが実行されます。 initを利用するプラグインコードは期待通りに動作するはずです。

テストはほとんどの場合、利用可能な関数やクラスを利用している単なる通常のコードです。異なる点は、それらがWP_UnitTestCaseを拡張するPHPUnit_Framework_TestCaseを拡張するクラスのメソッドとして書かれているということです。このクラスにラップされていると、テストはアサーションとオブジェクトファクトリにアクセスできるようになり、setUpメソッドとtearDownメソッドが実行されるため、各テストは互いに独立したものになります。

2
Simon Cossar

テストが実行される前に、WordPressがロードされるときにinitアクション呼び出されると言うことから始めましょう。ですから、あなたが自分のプラグインやテーマをWordPressで(例えばmuplugins_loadedにフックすることによって)ロードしているのであれば、あなたのコンストラクタがinitの前に呼び出されているなら、register_my_type()メソッドが呼び出されるべきです。 (そのようにプラグインをロードしていないのであれば、このチュートリアルを見てください。)

だからあなたのユニットテストであなたはこれを行うことができるはずです:

$this->assertTrue( post_type_exists( 'my_post_type' ) );

投稿タイプが正しい引数で登録されていることを確認するためにget_post_type()を使用することもできます。 (これは、私のショートコードが登録されていることを確認するために行うのと同じ種類のことです。)

メソッドが正しく呼び出されたかどうかを確認するために$wp_actions内のアクションのリストをチェックすることはできますが、メソッドが呼び出されたことをテストしようとする心配はありません。また、クラスプロパティを呼び出すときにフラグとして設定することもできますが、そのすべてがやり過ぎであると私は思います。 initのようなアクション、特に一度だけ実行する必要があるこのような関数に夢中になるものになると、機能テストはあなたの最善の策です。メソッドが呼び出されたかどうかのように単一のユニットをテストすることに集中するのではなく、彼らがするべきことをしていることを確認してください。

ただし、投稿タイプの登録を解除して手動でメソッドを呼び出すことで、メソッドが投稿タイプを登録することをテストすることもできます。 WordPressはderegister_post_type()関数を提供しているようには見えないので、$wp_post_typesグローバルを直接めちゃくちゃにする必要があります。あなたはそれからあなたの投稿タイプを削除してからあなたのメソッドを呼び出してそれが再び登録されているかどうかをチェックすることができます。

1
J.D.