¿Por qué no puedo PHPUnit UnitTest mi sitio web de Wordpress

4

He estado investigando este problema durante días y, aunque muchas personas me hacen esta pregunta, nunca encontré una respuesta clara y concisa.

Estoy corriendo:

  • Unidad de PHP: Versión 3.7.21
  • WordPress: Versión 3.5.1
  • SO: Ubuntu 11.10
  • MySQL: Versión 5.1.69-0ubuntu0.11.10.1
  • PHP: Versión 5.3.6-13ubuntu3.10

En pocas palabras, tengo el núcleo básico de wordPress descargado en un directorio de mi computadora. He descargado e instalado con éxito pera y phpunit. Probé phpunit escribiendo pruebas básicas en archivos php simples que funcionaron bien. Mi problema es cuando ejecuto phpunit en un sitio de wordpress (en el que no he cambiado los archivos básicos de WP).

Me sale el error:

  

"Error fatal de PHP: llamar a una función miembro main () en un no miembro   objeto en / < directorio raíz > /functions.php en la línea 779 ".

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

Después de un intenso rastreo de Internet, encontré que muchas personas tenían errores en esta línea exacta, así que sé que hay algo general, como una configuración del entorno o nuestro proceso de configuración que nos dio todo este error.

Algunas soluciones que he leído y probado no funcionaron para mí:

  • Cambie el archivo requerido en su archivo "index.php".
  • Coloque un requerimiento de "load.php" sobre la cabeza en su archivo "index.php".
  • Reinstalar WordPress
  • Cambie los entornos de correa de arranque y phpunit.

He sido desarrollador web durante 5 años, pero nunca antes había usado WordPress para uno de mis clientes. Una vez que pueda hacer esta configuración, las pruebas unitarias serán fáciles; pero no tengo idea de lo que está causando este problema. Cualquier enlace a guías / tutoriales o explicaciones claras sería muy apreciado. Gracias por tu tiempo.

--EDIT-- El archivo de prueba que estoy ejecutando es:

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

No usé ninguna prueba de función específica de WordPress; Acabo de realizar pruebas básicas que funcionan cuando no accedo a la página de inicio de mi sitio de WordPress y fallas cuando lo hago.

También otra nota; Configuré correctamente mi archivo de configuración y mi base de datos. El sitio funciona perfectamente bien, es solo que las pruebas de PHPUnit no pueden ejecutar con éxito los archivos de los sitios web.

    
pregunta Devon Bernard 14.06.2013 - 22:30

1 respuesta

3

Las pruebas unitarias para WordPress son una cosa difícil. Si necesita probar el código con una base de datos en vivo, etc., sugeriría que utilice el conjunto de pruebas oficial de WordPress . He obtenido pruebas unitarias ejecutando para un complemento que utiliza ese método antes, pero era No es bonita, y era bastante poco fiable. Sin embargo, si necesita hacerlo de esa manera, personalmente no pensaría hacerlo con otra cosa que no sea la prueba oficial.

Hay toneladas de información en el repositorio oficial en el blog principal de make . En el archivo bootstrap de su paquete de prueba, debe configurar las opciones que necesite reemplazar. Normalmente, serán complementos activos (para que pueda probar su complemento):

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

Después de eso, debe incluir el archivo includes/bootstrap.php del conjunto de pruebas del núcleo. Una vez hecho esto, tus pruebas deberían ejecutarse como "esperadas".

Sin embargo, en mi experiencia, ese tipo de pruebas nunca se ejecutan como se esperaba, ya que la base de datos y todo el código de WordPress introducen una cantidad increíble de dependencias y estados ocultos en sus pruebas. Por eso, prefiero burlarme de la API de WordPress y ejecutar mis pruebas sin todas esas dependencias y todo ese estado.

Para hacer eso, uso WP_Mock . Te permite simular el entorno de WordPress con un control detallado. Por ejemplo, si tiene una función que necesita agregar un filtro a 'the_content' y luego llamar a the_content() , el siguiente código para WP_Mock le permite probar eso:

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

Si las expectativas establecidas en WP_Mock no se cumplen, produce una excepción, lo que hace que la prueba falle.

    
respondido por el John P Bloch 14.06.2013 - 23:16

Lea otras preguntas en las etiquetas