2010-07-14 13 views
33

veces en mi código, voy a comprobar para ver si un determinado objeto implementa una interfaz:PHPUnit, las interfaces burlado, y instanceof

if ($instance instanceof Interface) {}; 

Sin embargo, la creación de burla de dicha interfaz en PHPUnit, no puedo parece pasar esa prueba.

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

entiendo que tiene una clase denominada interfaz es diferente de una clase que implementa la interfaz, pero no estoy seguro de cómo lidiar con esto.

¿Estoy obligado a burlarme de una clase concreta que implementa Interface? ¿No vencería eso el propósito de usar una interfaz para la portabilidad?

Gracias

Respuesta

38

Esto funciona para mí:

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

Tal vez sea un error tipográfico o tal vez $ instancia no es lo que creo que es?

+12

Sí, las cabezas frías prevalecen. Después de una noche de sueño completo, me di cuenta de que no estaba usando el espacio de nombres completamente calificado cuando me burlaba del objeto. –

+0

Caso de uso ligeramente diferente, pero ¿puedo verificar si una instancia es una instancia de una clase o un simulacro de la clase? – kapad

+0

@kapad Verá, este es el punto principal del Polimorfismo que no tiene que saber si el objeto actual es una instancia de clase o un simulacro. Si aún necesitas saber, entonces haces algo mal. P.S. Solo para su información, puede usar la función [get_class] (http://ca1.php.net/manual/en/function.get-class.php) para conocer el nombre de clase exacto del objeto – dVaffection

47

también hay assertInstanceOf como de 3.5.0

Ejemplo:

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

_Esta es la forma recomendada de verificación de tipos. – stefgosselin

+1

Además de la respuesta de @stefgosselin, esta es una forma recomendada de comprobación de tipos, ya que se obtienen mejores mensajes de error que se explican por sí mismos. Compare '' 'error al afirmar que el objeto es instancia de Class''' a' '' no puede afirmar que false es verdadero'''. –

+2

A partir de PHP 5.5, puede usar '\ Models \ User :: class' en lugar de' '\ Models \ User'', lo que hace que sea mucho más fácil hacer refactorización. –