web-dev-qa-db-fra.com

Pourquoi ne pas PHPUnit UnitTest sur mon site Wordpress

Je fais des recherches sur cette question depuis des jours et bien que beaucoup de gens me posent cette question, je n’ai jamais trouvé de réponse claire et concise.

Je cours:

  • Unité PHP: Version 3.7.21
  • WordPress: Version 3.5.1
  • OS: Ubuntu 11.10
  • MySQL: Version 5.1.69-0ubuntu0.11.10.1
  • PHP: Version 5.3.6-13ubuntu3.10

Pour résumer, j'ai la base de WordPress téléchargée dans un répertoire de mon ordinateur. J'ai téléchargé et installé avec succès pear et phpunit. J'ai testé phpunit en écrivant des tests de base sur de simples fichiers php qui fonctionnaient bien. Mon problème est quand je lance phpunit sur un site wordpress (dont je n'ai pas changé le noyau WP fichiers).

Je reçois l'erreur:

"Erreur irrécupérable PHP: Appel à une fonction membre main () sur un objet non membre dans/<répertoire_racine> /functions.php à la ligne 779".

Cette erreur correspond à ce segment de code:

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

Après des recherches intenses sur Internet, j'ai constaté que de nombreuses personnes avaient des erreurs sur cette ligne. Je sais donc qu'il existe un problème général, tel qu'un paramètre d'environnement ou notre processus de configuration, qui nous a fourni toutes ces erreurs.

Quelques solutions que j'ai j'ai lues et essayées qui n'ont pas fonctionné pour moi:

  • Modifiez le fichier requis dans votre fichier "index.php".
  • Placez une exigence de "load.php" au-dessus de la tête dans votre fichier "index.php".
  • Réinstaller WordPress
  • Changer les environnements de démarrage et phpunit.

Je suis développeur Web depuis 5 ans, mais je n’avais jamais utilisé WordPress pour l’un de mes clients auparavant. Une fois que je peux obtenir cette configuration, les tests unitaires seront faciles; mais je n'ai aucune idée de ce qui cause ce problème. Tous les liens vers des guides/tutoriels ou des explications claires seraient grandement appréciés. Merci pour votre temps.

--EDIT-- Le fichier de test que j'utilise est le suivant:

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

Je n'ai utilisé aucun test de fonction spécifique à WordPress; Je viens de lancer des tests de base qui fonctionnent lorsque je n'accède pas à la page d'accueil de mon site WordPress et échouent lorsque je le fais.

Aussi une autre note; J'ai correctement configuré mon fichier de configuration et ma base de données. Le site fonctionne parfaitement, c’est que les tests de PHPUnit ne permettent pas d’exécuter correctement les fichiers du site Web.

4
Devon Bernard

Les tests unitaires pour WordPress sont une chose délicate. Si vous avez besoin de tester le code avec une base de données active, etc., je vous suggérons d'utiliser la suite de tests officielle de WordPress . J'ai eu des tests unitaires en cours d'exécution pour un plugin utilisant cette méthode avant, mais ce n'était pas joli et était assez peu fiable. Si vous avez besoin de le faire de cette façon, cependant, personnellement, je ne penserais pas à le faire avec autre chose que la suite de tests officielle.

Il y a des tonnes d'informations sur le référentiel officiel du blog make make . Dans le fichier d'amorçage de votre suite de tests, vous devez configurer toutes les options que vous devez remplacer. Normalement, ce sont des plugins actifs (vous pouvez donc tester votre plugin):

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

Ensuite, vous devez inclure le fichier includes/bootstrap.php de la suite de tests principale. Une fois que cela est fait, vos tests doivent fonctionner comme "prévu".

D'après mon expérience, toutefois, ces types de tests ne s'exécutent jamais comme prévu, car la base de données et tout le code WordPress introduisent une quantité insensée de dépendances cachées et d'état dans vos tests. Pour cette raison, je préfère simplement me moquer de l’API WordPress et exécuter mes tests sans toutes ces dépendances et tout cet état.

Pour ce faire, j'utilise WP_Mock . Il vous permet de simuler l'environnement WordPress avec un contrôle affiné. Par exemple, si vous avez une fonction qui doit ajouter un filtre à 'the_content' et ensuite appeler the_content(), le code suivant pour WP_Mock vous permet de tester cela:

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

Si les attentes définies dans WP_Mock ne sont pas satisfaites, une exception est générée, ce qui entraîne l'échec du test.

3
John P Bloch