2010-07-14 17 views
33

A volte nel mio codice, io controllerò per vedere se un particolare oggetto implementa un'interfaccia:PHPUnit, interfacce deriso, e instanceof

if ($instance instanceof Interface) {}; 

Tuttavia, la creazione di mock detto interfaccia PHPUnit, non posso sembra passare quel test.

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

Capisco che avere una classe denominata interfaccia è diversa da una classe che implementa l'interfaccia, ma non sono sicuro di come ottenere accordo con questo.

Sono obbligato a prendere in giro una classe concreta che implementa l'interfaccia? Non sarebbe questo a vanificare lo scopo di utilizzare un'interfaccia per la portabilità?

Grazie

risposta

38

Questo funziona per me:

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

Forse è un errore di battitura o forse $ istanza non è quello che penso che sia?

+12

Sì, le teste più fredde prevalgono. Dopo una notte di sonno completo, mi sono reso conto che non stavo usando lo spazio dei nomi completo quando prendevo in giro l'oggetto. –

+0

Caso d'uso leggermente diverso, ma posso controllare se un'istanza è un'istanza di una classe o una simulazione della classe. – kapad

+0

@kapad Vedete, questo è il punto principale del polimorfismo che non dovete sapere se l'oggetto corrente è e l'istanza della classe o un mock. Se hai ancora bisogno di sapere, allora fai qualcosa di sbagliato. P.S. Solo FYI puoi usare la funzione [get_class] (http://ca1.php.net/manual/en/function.get-class.php) per conoscere il nome esatto della classe dell'oggetto – dVaffection

47

c'è anche assertInstanceOf al 3.5.0

Esempio:

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

_Questo è raccomandato per il tipo di controllo. – stefgosselin

+1

In aggiunta alla risposta @stefgosselin, questo è il metodo consigliato per il controllo dei tipi, poiché i messaggi di errore si spiegano meglio da soli. Confronta '' 'fallito affermando che l'oggetto è istanza di Class''' a' '' fallire affermando che false is true'''. –

+2

A partire da PHP 5.5 è possibile utilizzare '\ Models \ User :: class' anziché' '\ Models \ User'', il che rende molto più facile eseguire il refactoring. –