2010-07-14 5 views
33

Parfois, dans mon code, je vais vérifier pour voir si un objet particulier implémente une interface:PHPUnit, interfaces moqué et instanceof

if ($instance instanceof Interface) {}; 

Toutefois, la création se moque de ladite interface dans PHPUnit, je ne peux pas semblent passer ce test.

// class name is Mock_Interface_431469d7, does not pass above check 
$instance = $this->getMock('Interface'); 

Je comprends que d'avoir une classe interface nommée est différente d'une classe qui implémente l'interface, mais je ne suis pas sûr de savoir comment se faire face. Est-ce que je suis obligé de simuler une classe concrète qui implémente Interface? Cela ne va-t-il pas à l'encontre de l'objectif d'utiliser une interface pour la portabilité?

Merci

Répondre

38

Cela fonctionne pour moi:

$mock = $this->getMock('TestInterface'); 
$this->assertTrue($mock instanceof TestInterface); 

Peut-être est une faute de frappe ou peut-être $ instance est pas ce que vous pensez qu'il est?

+12

Yep, la tête froide prévalent. Après une nuit de sommeil complet, je me suis rendu compte que je n'utilisais pas l'espace de noms pleinement qualifié lorsque je me moquais de l'objet. –

+0

Cas d'utilisation légèrement différent, mais puis-je vérifier si une instance est une instance d'une classe ou d'un simulacre de la classe. – kapad

+0

@kapad Vous voyez, c'est le point principal du polymorphisme que vous n'avez pas besoin de savoir si l'objet courant est et l'instance de classe ou un simulacre. Si vous avez encore besoin de savoir, alors vous faites quelque chose de mal. P.S. Juste pour info, vous pouvez utiliser la fonction [get_class] (http://ca1.php.net/manual/fr/function.get-class.php) pour connaître le nom exact de la classe de l'objet – dVaffection

47

il y a aussi des assertInstanceOf comme 3.5.0

Exemple:

$this->assertInstanceOf('\Models\User', $this->userService->findById(1)); 
+2

_Cette méthode est recommandée pour la vérification de type. – stefgosselin

+1

En plus de la réponse @stefgosselin, il est recommandé de vérifier le type, car vous obtenez de meilleurs messages d'erreur explicites. Comparer '' 'n'a pas réussi à affirmer que l'objet est une instance de Class''' à' '' échouer à affirmer que false est vrai'''. –

+2

Depuis PHP 5.5, vous pouvez utiliser '\ Models \ User :: class' à la place de' '\ Models \ User'', ce qui facilite grandement le refactoring. –