Pergunta

Tenho trabalhado muito para que o PHPUnit funcione bem com o WordPress (com a ajuda de esse, esse, esse, esse, e esse), e acho que cheguei bem perto.O código que executo diretamente antes dos meus testes se parece com este (basicamente retirado literalmente de Este artigo):

( 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 bem, exceto que as funções retornam coisas diferentes com base em onde estão no arquivo.Por exemplo, fora de uma classe de teste, shortcode_exists retorna verdadeiro, enquanto dentro de um caso de teste é exatamente o mesmo shortcode_exists instrução retorna falso.O que estou fazendo de errado?

Aqui está o conteúdo de todo o arquivo de teste:

[O arquivo mudou desde que postei originalmente...]

EDITAR:Ok, segui o tutorial de J.D. o mais fielmente que pude.Parece realmente fechar.Agora estou recebendo este erro:

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}

Alguma ideia de como posso consertar isso?Enquanto isso, continuarei verificando todos os caminhos de arquivo que defini nos vários arquivos de configuração.

EDITAR EDITAR:Esse último erro foi resolvido modificando a configuração do PhpStorm que eu estava usando.Você deve defini-lo como "Usar arquivo de configuração alternativo" e definir o escopo do teste como "Definido no arquivo de configuração".

Foi útil?

Solução

A razão pela qual isso está acontecendo não é por causa de nada no código que você postou, por si só, mas por causa de como você configurou o PHPUnit.Os retornos de chamada do shortcode são armazenados em um formato global ($shortcode_tags).Quando você carrega o WP, o shortcode é registrado e adicionado ao arquivo global.Você chama shortcode_exists(), ele verifica $shortcode_tags, e retorna true.Então o PHPUnit começa a executar seus testes.E limpa o escopo da variável global.Então, quando seu teste for executado, $shortcode_tags não existe mais, então shortcode_exists() informa que seu shortcode não está registrado.(O PHPUnit irá então restaurar o escopo global para o que era antes do teste, para que os testes não afetem as variáveis ​​globais.Correndo shortcode_exists() depois que os testes terminarem, reportaria true.)

PHPUnit tem o backupGlobals configuração e configurá-lo para false impedirá que o PHPUnit toque no escopo global.E isso deve resolver seus problemas.No entanto....

Uma maneira mais excelente

Como o autor de este tutorial, gostaria de recomendar que você configurasse seus testes mais como mostro lá.A razão é que você não terá que escrever todo esse bootstrap para fazer o PHPUnit brincar com o WordPress.Em vez disso, você deve apenas usar o bootstrap PHPUnit do WordPress, que, obviamente, já foi projetado para funcionar bem com o WordPress.:-)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a wordpress.stackexchange
scroll top