Pregunta

He estado trabajando muy duro para que PHPUnit funcione bien con WordPress (con la ayuda de este, este, este, este, y este), y creo que me he acercado bastante.El código que ejecuto directamente antes de mis pruebas se ve así (básicamente extraído palabra por palabra de Este artículo):

( 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 );

Parece funcionar bien, excepto que las funciones devuelven cosas diferentes según su ubicación en el archivo.Por ejemplo, fuera de una clase de prueba, shortcode_exists devuelve verdadero, mientras que dentro de un caso de prueba exactamente lo mismo shortcode_exists La declaración devuelve falso.¿Qué estoy haciendo mal?

Aquí está el contenido de todo el archivo de prueba:

[El archivo ha cambiado desde que publiqué esto originalmente...]

EDITAR:Ok, he seguido el tutorial de J.D. lo más de cerca que pude.Se siente en realidad cerca.Ahora recibo este error:

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}

¿Alguna idea de cómo puedo solucionarlo?Mientras tanto, seguiré verificando todas las rutas de archivo que definí en los distintos archivos de configuración.

EDITAR EDITAR:Ese último error se resolvió modificando la configuración de PhpStorm que estaba usando.Debe configurarlo en "Usar archivo de configuración alternativo" y establecer el alcance de la prueba en "Definido en el archivo de configuración".

¿Fue útil?

Solución

La razón por la que esto sucede en realidad no es por nada en el código que has publicado, per se, sino por cómo has configurado PHPUnit.Las devoluciones de llamada de shortcode se almacenan en un global ($shortcode_tags).Cuando carga WP, el shortcode se registra y se agrega al global.Llama shortcode_exists(), comprueba $shortcode_tags, y regresa true.Entonces PHPUnit comienza a ejecutar sus pruebas.Y borra el alcance de la variable global.Entonces, cuando se ejecuta la prueba, $shortcode_tags ya no existe, entonces shortcode_exists() informa que su shortcode no está registrado.(PHPUnit luego restaurará el alcance global a lo que era antes de la prueba, de modo que las pruebas no afecten las variables globales.Correr shortcode_exists() Una vez finalizadas las pruebas, informaría. true.)

PHPUnit tiene el backupGlobals configurarlo y configurarlo en false evitará que PHPUnit toque el alcance global.Y eso debería solucionar tus problemas.Sin embargo....

Una manera más excelente

Como autor de este tutorial, Me gustaría recomendarte que configures tus pruebas más como muestro allí.La razón es que no tendrás que escribir todo este programa de arranque para que PHPUnit funcione con WordPress.En su lugar, deberías usar el programa de arranque PHPUnit de WordPress, que, obviamente, ya está diseñado para funcionar bien con WordPress.:-)

Licenciado bajo: CC-BY-SA con atribución
scroll top