it-swarm-ja.com

WordPress関数はPHPUnitテストの内側と外側で異なる結果をもたらします

私はPHPUnitをWordPressでうまく動作させるために一生懸命働いてきました( thisthis の助けを借りて) /、 thisthis 、および this そして、私は私がかなり近くなったと思います。テストの直前に実行したコードは次のようになります(基本的に this article から逐語的に削除されます)。

( PHP_SAPI === 'cli' ) || die( 'Access Denied' );

define( 'PHPUNIT_DB_PREFIX', 'phpunit_' );

global $wp_rewrite, $wpdb;

define( 'WP_MEMORY_LIMIT', '100M' );

require_once( dirname( __FILE__ ) . '/../../../../wp-load.php' );
require_once( ABSPATH . 'wp-admin/includes/admin.php' );

wp_set_current_user( 1 );

関数はファイル内の場所に基づいて異なるものを返すという点を除けば、うまく機能するようです。たとえば、テストクラス外ではshortcode_existsはtrueを返しますが、テストケース内ではまったく同じshortcode_existsステートメントはfalseを返します。何がおかしいのですか?

テストファイル全体の内容は次のとおりです。

[最初に投稿してからファイルが変更されました...]

編集:わかりました、それで私はできる限り密接にJ.D.のチュートリアルに従いました。 本当に近いと感じます。私は今、このエラーを受けています:

PHPUnit_Framework_Error_Warning : copy(data/not-gettexted-0.php): failed to open stream: No such file or directory
#0 [internal function]: PHPUnit_Util_ErrorHandler::handleError(2, 'copy(data/not-g...', '/Applications/w...', 41, Array)
#1 /Applications/wordpress-3.8.3-0/apps/wordpress/htdocs/wp-content/plugins/hf-accountability/tests/wordpress-dev/trunk/tools/i18n/t/NotGettextedTest.php(41): copy('data/not-gettex...', 'data/not-gettex...')
#2 [internal function]: NotGettextedTest->test_replace()
#3 phar:///Applications/wordpress-3.8.3-0/apps/wordpress/htdocs/wp-content/plugins/hf-accountability/tests/phpunit-lts.phar/phpunit/Framework/TestCase.php(988): ReflectionMethod->invokeArgs(Object(NotGettextedTest), Array)
#4 phar:///Applications/wordpress-3.8.3-0/apps/wordpress/htdocs/wp-content/plugins/hf-accountability/tests/phpunit-lts.phar/phpunit/Framework/TestCase.php(838): PHPUnit_Framework_TestCase->runTest()
#5 phar:///Applications/wordpress-3.8.3-0/apps/wordpress/htdocs/wp-content/plugins/hf-accountability/tests/phpunit-lts.phar/phpunit/Framework/TestResult.php(648): PHPUnit_Framework_TestCase->runBare()
#6 phar:///Applications/wordpress-3.8.3-0/apps/wordpress/htdocs/wp-content/plugins/hf-accountability/tests/phpunit-lts.phar/phpunit/Framework/TestCase.php(783): PHPUnit_Framework_TestResult->run(Object(NotGettextedTest))
#7 phar:///Applications/wordpress-3.8.3-0/apps/wordpress/htdocs/wp-content/plugins/hf-accountability/tests/phpunit-lts.phar/phpunit/Framework/TestSuite.php(779): PHPUnit_Framework_TestCase->run(Object(PHPUnit_Framework_TestResult))
#8 phar:///Applications/wordpress-3.8.3-0/apps/wordpress/htdocs/wp-content/plugins/hf-accountability/tests/phpunit-lts.phar/phpunit/Framework/TestSuite.php(749): PHPUnit_Framework_TestSuite->runTest(Object(NotGettextedTest), Object(PHPUnit_Framework_TestResult))
#9 phar:///Applications/wordpress-3.8.3-0/apps/wordpress/htdocs/wp-content/plugins/hf-accountability/tests/phpunit-lts.phar/phpunit/Framework/TestSuite.php(709): PHPUnit_Framework_TestSuite->run(Object(PHPUnit_Framework_TestResult), false, Array, Array, false)
#10 phar:///Applications/wordpress-3.8.3-0/apps/wordpress/htdocs/wp-content/plugins/hf-accountability/tests/phpunit-lts.phar/phpunit/TextUI/TestRunner.php(350): PHPUnit_Framework_TestSuite->run(Object(PHPUnit_Framework_TestResult), false, Array, Array, false)
#11 phar:///Applications/wordpress-3.8.3-0/apps/wordpress/htdocs/wp-content/plugins/hf-accountability/tests/phpunit-lts.phar/phpunit/TextUI/Command.php(176): PHPUnit_TextUI_TestRunner->doRun(Object(PHPUnit_Framework_TestSuite), Array)
#12 /private/var/folders/r5/0w5bp7b13pndfymz_pgf_zz00000gn/T/ide-phpunit.php(268): PHPUnit_TextUI_Command->run(Array, true)
#13 /private/var/folders/r5/0w5bp7b13pndfymz_pgf_zz00000gn/T/ide-phpunit.php(506): IDE_Base_PHPUnit_TextUI_Command::main()
#14 {main}

どのように私はそれを修正することができますか?その間、私はいくつかの設定ファイルで定義したすべてのファイルパスをチェックし続けるつもりです。

EDIT EDIT:その最後のエラーは私が使っていたPhpStorm設定を修正することで解決されました。両方とも「Use alternative configuration file」に設定し、テストスコープを「Defined in configuration file」に設定する必要があります。

2
Nathan Arthur

これが実際に起こっている理由は、実際にあなたが投稿したコード内の何かによるものではなく、PHPUnitがどのように設定されているかによるものです。ショートコードコールバックはグローバル($shortcode_tags)に格納されています。 WPをロードすると、ショートコードが登録されてグローバルに追加されます。 shortcode_exists()を呼び出すと、$shortcode_tagsをチェックしてtrueを返します。それからPHPUnitはあなたのテストを実行し始めます。そしてそれはグローバル変数スコープをクリアします。そのため、テストが実行されると、$shortcode_tagsはもう存在しないので、shortcode_exists()はあなたのショートコードが登録されていないと報告します。 (PHPUnitはグローバルスコープをテスト前の状態に戻しますので、テストはグローバル変数に影響を与えません。テスト終了後にshortcode_exists()を実行するとtrueとなります。)

PHPUnitはbackupGlobals設定を持っています、そしてそれをfalseに設定することはPHPUnitがグローバルスコープに触れるのを防ぎます。そしてそれはあなたの問題を解決するはずです。しかしながら....

もっと優れた方法

このチュートリアルの作者 として、私がそこに示すようにテストを設定することをお勧めします。その理由は、PHPUnitをWordPressで動作させるためにこのブートストラップをすべて作成する必要がないからです。代わりに、WordPressのPHPUnitブートストラップを使用する必要があります。これは明らかに、WordPressでNiceを実行するようにすでに設計されています。 :-)

3
J.D.