2010-11-11 5 views
6

J'ai un ensemble de tests, et je veux tester que mes classes jettent des exceptions au bon moment. Dans l'exemple, ma classe utilise la méthode magique __get(), donc je dois tester qu'une exception est levée lorsqu'une propriété non valide est récupéré:PHPUnit n'attrape pas les exceptions attendues

function testExceptionThrownWhenGettingInvalidProperty() { 
    $obj = new MyClass(); 
    $this->setExpectedException("Property qwerty does not exist"); 
    $qwerty = $obj->qwerty; 
} 

La classe renvoie une erreur comme il se doit, mais au lieu de juste obtenir un laissez-passer, l'exception n'est pas attrapée!

There was 1 error: 

1) QueryTest::testExceptionThrownWhenGettingInvalidProperty 
Exception: Property qwerty does not exist 

j'utilisais SimpleTest avant et $this->expectException(new Exception("Property qwerty does not exist")); travaillé très bien. Je sais qu'il existe d'autres méthodes (@expectedException et try-catch), mais celle-ci devrait fonctionner et elle semble beaucoup plus propre. Des idées comment je peux faire ce travail?

Répondre

13

Il ne cherche pas le texte à l'exception, il cherche le nom de la classe d'exception ... Docs

$this->setExpectedException('Exception'); 

Il est tout à fait à portée de main lorsque vous utilisez SPL Exceptions ou classes d'exception personnalisée .. .

+0

Merci! J'ai complètement oublié cela parce que j'étais habitué à la façon SimpleTest de le faire. Savez-vous s'il existe un moyen facile de tester le texte? –

+0

@Nathan, @ircmaxell: Voir ma réponse, il y a une meilleure façon de le faire, y compris le test du texte. – ryeguy

+0

@ircmaxell: Je ne suis pas d'accord avec le message, peu importe. Vous ne voyez pas de langages ou de frameworks bien conçus qui créent une nouvelle exception pour chaque nouvelle erreur apparaissant. Ce serait juste trop de travail. – ryeguy

13

Ajout à la réponse de ircmaxell, il est en fait un moyen plus simple de le faire:

/** 
* @expectedException MyExceptionClass 
* @expectedExceptionMessage Array too small 
*/ 
public function testSomething() 
{ 
} 

Le @expectedException le nom de classe de l'exception à attendre, et @expectedExceptionMessage est une sous-chaîne du message d'exception à attendre (c'est exact, vous n'avez pas besoin d'avoir le message entier).

Si vous préférez ne pas utiliser les annotations docblock, ces deux méthodes sont disponibles en tant que méthodes dans le scénario de test.

+4

+1 ... Je n'étais pas au courant du '@expectedExceptionMessage 'élément docblock ... Apprenez quelque chose de nouveau tous les jours ... – ircmaxell

+0

@ircmaxell: Oui, je viens de le découvrir il y a un peu de moi-même. Il n'y en a nulle part, sauf dans l'annexe "Annotations". Même alors, il n'y a pas de docs dessus, il ne fait qu'énumérer son nom. – ryeguy

+0

très gentil - merci vous! – jmadsen

Questions connexes