Por que não é possível usar PHPUnit UnitTest no meu site Wordpress?

4

Eu venho pesquisando esse assunto há dias e, embora muitas pessoas façam essa pergunta, eu nunca encontrei uma resposta clara e concisa.

Estou a correr:

  • Unidade do PHP: Versão 3.7.21
  • WordPress: versão 3.5.1
  • SO: Ubuntu 11.10
  • MySQL: Versão 5.1.69-0ubuntu0.11.10.1
  • PHP: Versão 5.3.6-13ubuntu3.10

Para encurtar a história, eu tenho o núcleo básico do wordPress baixado em um diretório no meu computador. Eu baixei e instalei com sucesso a pêra e o phpunit. Eu testei o phpunit escrevendo testes básicos em arquivos php simples que funcionavam bem. Meu problema é quando eu executo phpunit em um site wordpress (que eu não mudei os arquivos WP principais de).

Eu recebo o erro:

  

"Erro fatal do PHP: Chame para uma função-membro main () em um não-membro   objeto em / < root_directory > /functions.php na linha 779 ".

Este erro corresponde a este segmento de código:

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;
}

Depois de um intenso rastreamento da Internet, descobri que muitas pessoas tinham erros nessa linha exata, por isso sei que há alguma coisa geral, como uma configuração de ambiente ou nosso processo de configuração, que nos causou todo esse erro.

Algumas soluções que eu tenho leram e testaram não funcionaram para mim:

  • Altere o arquivo necessário em seu arquivo "index.php".
  • Coloque uma exigência de "load.php" acima da cabeça em seu arquivo "index.php".
  • Reinstale o WordPress
  • Altere os ambientes de boot-strap e phpunit.

Sou desenvolvedor da Web há 5 anos, mas nunca usei o WordPress para um de meus clientes antes. Uma vez que eu possa fazer isso, escrever os testes de unidade será fácil; mas não tenho ideia do que está causando esse problema. Quaisquer links para guias / tutoriais ou explicações claras seriam muito apreciados. Obrigado pelo seu tempo.

- EDIT-- O arquivo de teste que estou executando é:

<?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);
    }
}
?>

Eu não usei nenhum teste de função específico do WordPress; Acabei de executar testes básicos que funcionam quando não acesso a página inicial do meu site WordPress e falho quando o faço.

Outra nota também; Eu configurei corretamente meu arquivo de configuração e meu banco de dados. O site funciona perfeitamente, é apenas o PHPUnit testes são incapazes de executar com sucesso os arquivos de sites.

    
por Devon Bernard 14.06.2013 / 22:30

1 resposta

3

Testes de unidade para o WordPress são complicados. Se você precisa testar o código com um banco de dados ao vivo, etc. Eu sugiro usar o pacote oficial de testes do WordPress . Eu obtive testes de unidade executando um plugin usando esse método antes, mas não foi bonito e pouco confiável. Se você precisar fazer isso dessa maneira, eu pessoalmente não pensaria em fazer isso com nada além da suíte oficial de testes.

Existem toneladas de informações no repositório oficial no blog central make . No arquivo de bootstrap da sua suíte de testes, você precisa configurar quaisquer opções que você precisa sobrescrever. Normalmente, isso vai ser plugins ativos (assim você pode testar seu plugin):

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

Depois disso, você precisa incluir o arquivo includes/bootstrap.php do pacote principal de testes. Feito isso, seus testes devem ser executados como "esperados".

Na minha experiência, no entanto, esses tipos de testes nunca são executados como esperado, uma vez que o banco de dados e todo o código do WordPress introduzem uma quantidade insana de dependências e estados ocultos em seus testes. Por causa disso, eu prefiro apenas zombar da API do WordPress e executar meus testes sem todas aquelas dependências e todo esse estado.

Para fazer isso, eu uso WP_Mock . Ele permite que você simule o ambiente do WordPress com controle refinado. Por exemplo, se você tiver uma função que precise adicionar um filtro a 'the_content' e, em seguida, chamar the_content() , o código a seguir para WP_Mock permitirá que você teste isso:

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

Se as expectativas estabelecidas no WP_Mock não forem atendidas, ele lançará uma exceção, fazendo com que o teste falhe.

    
por John P Bloch 14.06.2013 / 23:16