2010-11-15 10 views
1

En PHPUnit, il y a des moments où une assertion échoue, et lors de la déclaration de l'assertion, PHPUnit appelle automatiquement var_export() sur la variable. Disons que vous avez appelé ce morceau de code:Comment remplacer var_export dans PHPUnit?

$foo = new StdClass(); 
$foo->bar = 123; 
$foo->baz = "Hi there"; 
$this->assertTrue($foo); 

La sortie de c'est:

Failed asserting that 
stdClass Object 
(
    [bar] => 123 
    [baz] => Hi there 
) 
is true. 

Si la variable est un objet d'exception, cela peut provoquer le test unitaire pour imprimer méga-octets de texte lorsque marcher dans l'arbre des objets, y compris les traces de la pile et d'autres informations. Parfois, PHPUnit meurt parce qu'il manque de mémoire pour essayer de tout sortir.

Je sais qu'une solution consiste à ajouter un test supplémentaire, en vérifiant si la variable est un objet avant de faire le assertTrue, ou un assertEquals. Mais mon équipe a actuellement beaucoup de tests unitaires.

Je me demandais donc s'il y avait un moyen de contourner le comportement par défaut de PHPUnit d'appeler var_export sur une variable lors de la génération du rapport d'erreurs.

Merci d'avance.

+0

Vous pouvez toujours faire '$ this-> assertTrue ($ foo === true)' ... – ircmaxell

+0

Je ne me souviens pas que les traces de la pile par défaut de PHP soient quelque chose comme des mégaoctets. Utilisez-vous Xdebug ou quelque chose? –

+0

@Jani je suppose qu'il ne parle pas de la trace de la piste, mais la variable immergée (par exemple l'objet). Et si vous avez un objet avec une variable membre qui contient un livre (ou w/e) alors c'est beaucoup de sortie – edorian

Répondre

1

Après avoir creusé autour de certains je n'ai pas trouvé un drapeau ou quelque chose pour y parvenir si j'ai essayé de travailler à rebours à partir du code:

Le code en question vivent dans (de la print_r): PHPUnit_Framework_ComparisonFailure_Object « s toString() méthode et je ne vois pas un moyen de fournir une autre implémentation pour cette classe sans changer le code dans phpunit (puisque l'objet est créé dans un appel statique)

Donc, pour le débogage, vous pouvez changer cela en place, mais que ofc. conduit aux problèmes habituels que vous obtenez en changeant le code de tiers et puisque vous avez dit que vous avez beaucoup de code que vous pourriez ne pas vouloir faire cela puisque vous comptez sur le travail de phpunit comme tout le monde s'attend.

une manière qui ne repose pas sur changeing code PHPUnit et pourrait être moins de tracas que de passer par tous vos tests et changeing tous les appels assertTrue() pourrait être quelque chose le long de ces lignes:

Si tous vos tests utiliser une classe de base, il est encore plus facile à mettre en:

<?php 

class ErrorTest extends PHPUnit_Framework_TestCase { 

    public function test1() { 
     $foo = new StdClass(); 
     $foo->bar = 123; 
     $foo->baz = "Hi there"; 
     $this->assertTrue($foo); 
    } 

    public static function assertTrue($x) { 
     if(is_object($x)) { 
      self::fail("Expecting True, got Object of Type: ".get_class($x)); 
     } 
     parent::assertTrue($x); 
    } 
} 

->

phpunit ErrorTest.php 
PHPUnit 3.4.15 by Sebastian Bergmann. 

F 

Time: 0 seconds, Memory: 4.25Mb 

There was 1 failure: 

1) ErrorTest::test1 
Expecting True, got Object of Type: stdClass 

/home/mcsvnls/ErrorTest.php:15 
/home/mcsvnls/ErrorTest.php:9 

FAILURES! 
Tests: 1, Assertions: 0, Failures: 1. 

Alors que je suis pas sûr que c'est une "bonne" solution c'est le meilleur que je pourrais trouver en ce moment, peut-être que ça aide :)

+1

Merci, cela aide. J'ai regardé la source moi-même, et j'ai découvert que dans PHPUnit_Framework_Constraint :: failureDescription(), il appelle la fonction PHPUnit_Util_Type :: toString ($ other) sur la valeur qui a échoué au test. Si vous passez un second paramètre de true à cette fonction, il ne fait pas print_r sur la variable. Cependant, il n'y a aucun moyen de modifier ce comportement par défaut. La meilleure solution que j'ai trouvée est de redéfinir isTrue() et que cela retourne une sous-classe de Zoosk_Constraint_IsTrue qui définit la fonction customFailureDescription(). – JonM