WordPressのユニットテストでthe_content()が期待通りに出力されないときの対処法
※本ページはプロモーションが含まれていますWordPressのユニットテストで、記事の内容に追記するプラグインをテストしていたのですが、「the_content()」の内容がテストでうまく表示されず困りました。
「the_content()」のテストは調べたところ下記のように行うようです。(H2タグの前にtextを挿入する機能のテスト)
function test_sample() { global $post; $post_id = $this->factory->post->create( array( 'post_content' => '<h2>見出し</h2>' ) ); $post = get_post( $post_id ); setup_postdata( $post ); $expect = 'text<h2>見出し</h2>' . PHP_EOL; $this->expectOutputString( $expect ); the_content(); }
しかし、僕のプラグインは、通常の環境だと出力がちゃんとできているのに、テスト環境だと期待通りの出力がされませんでした。
原因は、作成した記事を「setup_postdata( $post )」しただけだからでした。
「setup_postdata( $post );」は、作成した記事をテスト内で「the_content()」など記事周りで使う関数を使えるようにするのですが、「is_single(),is_hone()」など、ページ独自の機能が動作していないのが原因で、期待通りの結果にならなかったのです。
加えて、テスト内で「update_option」した値を、プラグインの「get_option」がちゃんと取得できていなかったのも原因。
解決策は、「$this->go_to()」 を使い、「 $this->factory->post->create()」で作成した記事に移動させればOKでした。
function test_sample() { global $post; $post_id = $this->factory->post->create( array( 'post_content' => '<h2>見出し</h2>' ) ); $this->go_to( get_the_permalink( $post_id ) ); $expect = 'text<h2>見出し</h2>' . PHP_EOL; $this->expectOutputString( $expect ); the_content(); }
表示結果をテストするには、「$this->go_to()」で該当ページへ移動してからテストする方が確実ですね。
「$this->go_to()」は「abstract-testcase.php」にかかれています。