私のクラスのコンストラクタは '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
メソッドが実行されるため、各テストは互いに独立したものになります。
テストが実行される前に、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
グローバルを直接めちゃくちゃにする必要があります。あなたはそれからあなたの投稿タイプを削除してからあなたのメソッドを呼び出してそれが再び登録されているかどうかをチェックすることができます。