web-dev-qa-db-ja.com

なぜPHPUnit UnitTestは私のWordpressのウェブサイトをテストすることができません

私は何日もこの問題を研究してきました、そして多くの人がこの質問をしますが、私ははっきりした簡潔な答えを見つけることができませんでした。

私は走っています:

  • PHPユニット:バージョン3.7.21
  • ワードプレス:バージョン3.5.1
  • OS:Ubuntu 11.10
  • MySQL:バージョン5.1.69-0ubuntu0.11.10.1
  • PHP:バージョン5.3.6-13ubuntu3.10

手短に言えば、私は基本的なwordPressコアを私のコンピュータのディレクトリにダウンロードしました。 pearとphpunitをダウンロードしてインストールしました。私は正常に動作する単純なphpファイルで基本的なテストを書くことでphpunitをテストしました。私の問題は、私がワードプレスのサイトでphpunitを実行したときです(私はそのコアのWPファイルを変更していません)。

私はエラーが出ます:

"PHPの致命的なエラー:779行目の/ <root_directory> /functions.php内のメンバーでないオブジェクトに対してメンバー関数main()を呼び出しています。".

このエラーは、次のコードセグメントに対応しています。

function wp( $query_vars = '' ) {
    global $wp, $wp_query, $wp_the_query;
    $wp->main( $query_vars ); // Line 779

    if ( !isset($wp_the_query) )
        $wp_the_query = $wp_query;
}

いくつかの激しいインターネットクロールの後、私は多くの人々がこの正確な行にエラーを持っているのを見つけたので、環境設定やセットアッププロセスのような一般的なものがあることを知っています。

私が持っているいくつかの解決策 読んで試した それは私のために働かなかった:

  • "index.php"ファイルで必要なファイルを変更してください。
  • あなたの "index.php"ファイルの頭の上に "load.php"が必要です。
  • WordPressを再インストール
  • ブートストラップとphpunit環境を変更してください。

私は5年間Web開発者でしたが、私はクライアントの1人にWordPressを使用したことがありません。この設定を書くことができれば、単体テストの作成は簡単になります。しかし、私は何がこの問題を引き起こしているのかわかりません。ガイド/チュートリアルまたは明確な説明へのリンクは大歓迎です。お時間をいただきありがとうございます。

--EDIT--私が実行しているテストファイルは次のとおりです。

<?php   
//include PHPUnit
require_once('PHPUnit/Autoload.php');
//include the code to be tested
require_once('../index.php');

// extend the PHPUnit class
class StackTest extends PHPUnit_Framework_TestCase {

    public function testOne(){
        $this->assertTrue(TRUE);
        $this->assertEquals(2,2);
        $this->assertTrue(1<3);
    }
}
?>

私はWordPress固有の機能テストを使用しませんでした。私は私のWordPressサイトのホームページにアクセスしないとうまくいく基本的なテストを実行しましたが、そうすると失敗しました。

また別のメモ。設定ファイルとデータベースを正しく設定しました。このサイトは完璧に機能しています。PHPUnitテストではWebサイトファイルを正常に実行できません。

4
Devon Bernard

WordPressの単体テストは難しいことです。ライブデータベースなどでコードをテストする必要がある場合は、 公式のWordPressテストスイート を使用することをお勧めします。私は そのメソッドを使ったプラグインのために/ /で単体テストを実行したことがあります それはきれいではなく、かなり信頼できませんでした。あなたがそのようにそれをする必要があるなら、けれども、私は個人的に公式のテストスイート以外でそれをすることを考えないでしょう。

たくさんの情報があります コアmake blogの公式リポジトリにあります 。テストスイートのブートストラップファイルで、上書きする必要があるオプションを設定する必要があります。通常、これはアクティブなプラグインになるでしょう(だからあなたのプラグインをテストすることができます):

$GLOBALS['wp_tests_options'] = array(
  'active_plugins' => array( 'plugin-folder/plugin-file.php' ), // Relative to WP Plugin directory
);

その後、コアテストスイートのincludes/bootstrap.phpファイルを含める必要があります。それが終わったら、あなたのテストは "期待通り"に実行されるべきです。

しかし私の経験では、データベースとすべてのWordPressコードがあなたのテストに非常に多くの隠れた依存関係と状態を導入するので、そのような種類のテストは期待通りには実行されません。そのため、私はWordPress APIをモックして、それらすべての依存関係とすべてのその状態なしでテストを実行することを好みます。

それをするために、私は WP_Mock を使います。それはあなたがきめ細かい制御でWordPress環境をシミュレートすることを可能にします。たとえば、'the_content'にフィルタを追加してからthe_content()を呼び出す必要がある関数がある場合は、次のWP_Mockのコードを使用してそれをテストできます。

WP_Mock::expectFilterAdded( 'the_content', 'some_callback_you_expect', 10, 2 );
WP_Mock::wpFunction( 'the_content', array(
  'times' => 1,
  'args'  => array(),
) );
your_function();

WP_Mockで説明されている期待値が満たされていないと、例外がスローされ、テストは失敗します。

3
John P Bloch