経験知ロゴ

WordPressのユニットテストでthe_content()が期待通りに出力されないときの対処法

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」にかかれています。

役に立ったらこの記事のシェアをお願いします

ブログのフォロー・RSS購読は下記ボタンから