it-swarm-ja.com

ユニットテストのためにtrunkの外でfactory.phpを使う

私はプラグインを書きました、そしてそれのためにいくつかの単体テストを設定する過程を経ています。

私のユニットテストの中で、私はWP_UnitTest_Factoryクラスを利用して投稿、ユーザーなどを作成するプロセスを手助けしています。

$this->factory->post->create( array( 'post_type' => 'announcement' ) );

Travis CIで単体テストを実行すると、LATEST以外のバージョンでWP_UnitTest_Factoryを参照しても失敗することがわかりました。

Travis CIでスローされているエラーは次のとおりです。

Notice: Trying to get property of non-object in /home/travis/build/build_name/project/tests/test-helper-functions.php on line 12

これは4.1、4.0、3.9.2で発生しています - WP_Version=latestのときではありません。

これは投稿を作成するためのWP_UnitTest_Factoryコード(上記)を参照しています。

私の考えはWP_UnitTest_Factoryはtrunkに含まれているので、LATESTで実行しているときはクラスが利用可能です。

古いバージョンで実行している場合、ファクトリクラスは存在しないため、エラーが発生します。

私は少し研究をして他のプラグインの単体テストをチェックアウトしました、そしてそれらはファクトリクラスを完全に使用することを避け、そして組み込みのwp関数(wp_insert_post())を使用します。

この問題を回避する方法はありますか。それとも、WP_UnitTest_Factoryクラスの代わりに組み込みのWP関数を使用してテストを古いバージョンのWordPressに渡すように、テストを書き直す必要がありますか?

2
EHerman

問題はファクトリクラスが利用できないということではありません、もしそうであれば、致命的な "class not found"エラーになるでしょう。問題は、テストケースを正しく使用していないことです。 このコード (および同様のコード)が問題の原因です。

/**
 * Testing that timeline_express_get_announcement_date() returns what we expect
 */
public function test_timeline_express_get_announcement_date() {
    // Re-instantiate this class
    $helper_functions_test_class = new TE_Helper_Tests;
    // Create some test announcements, passing in some defaults.
    $announcement_id = $helper_functions_test_class->test_create_announcement( '#FF6347', 'fa-plus', '04/04/1989' );
    // Grab the announcement date
    $announcement_date = timeline_express_get_announcement_date( $announcement_id );
    $comparison_date = date_i18n( get_option( 'date_format' ), strtotime( '04/04/1989' ) );
    // $announcement_date = get_post_meta( $announcement_id, 'announcement_date', true );
    $this->assertEquals( $announcement_date, $comparison_date );
}

ここでは、テストケースを自分で作成しています。つまり、テストケースのsetUp()メソッド(factoryプロパティが設定されている場所)を呼び出すように、PHPUnitが通常行うすべての設定をスキップしています。

そのため、今作成したクラスでtest_create_acnnouncement()を呼び出しても、factoryプロパティが設定されていないため、これらのエラーが発生します。

代わりに、そのテスト(およびそれを好む人)を次のようにリファクタリングする必要があります。

/**
 * Testing that timeline_express_get_announcement_date() returns what we expect
 */
public function test_timeline_express_get_announcement_date() {
    // Create some test announcements, passing in some defaults.
    $announcement_id = $this->test_create_announcement( '#FF6347', 'fa-plus', '04/04/1989' );
    // Grab the announcement date
    $announcement_date = timeline_express_get_announcement_date( $announcement_id );
    $comparison_date = date_i18n( get_option( 'date_format' ), strtotime( '04/04/1989' ) );
    // $announcement_date = get_post_meta( $announcement_id, 'announcement_date', true );
    $this->assertEquals( $announcement_date, $comparison_date );
}

つまり、クラスの新しいインスタンスを作成する部分を飛ばして、すでに持っているインスタンス$thisを使うだけです。

それでは、最新バージョンのテストスイートに対して実行したときにこのエラーが表示されないのはなぜですか?最新版にはファクトリを提供する__get()メソッドが含まれているからです。そのため、このプロパティは最新バージョンのテストで設定する必要はありません。しかし、これがあなたがしていたように手動でテストケースを構築するべきであるという指標であると思わないでください、それは普通のことではありません。

それで、あなたがファクトリを使うべきかどうかに関してあなたの最後の質問に答えるために、あなたがこれまで見たほとんどのプラグインが組み込みのWordPress機能を使っていた理由はそれらがファクトリを知らないからであるかもしれません。ファクトリを使用する必要はありませんが、それらの利点は、偽の投稿コンテンツなどを作成する必要がないことです。ファクトリはそれを自動的に生成します。

3
J.D.