2012-07-26 14 views
6

Sto cercando di creare un finto per soddisfare un typehint con questo codice (Mockery) diversa:quadri Mock torna classe con nome e il tipo

return \Mockery::mock('\Contracts\Helpers\iFileSystemWrapper'); 

o del presente (PHPUnit):

return $this->getMock('\Contracts\Helpers\iFileSystemWrapper'); 

Ma il mock restituito si chiama Mockery\Mock Object o Mock_iFileSystemWrapper_a5f91049. Come dovrei digitare controlla questo quando non è un'istanza di quello che mi serve per niente con entrambi i framework?

Perché esattamente il framework mock tenta di caricare la classe reale? Se volessi la vera classe, includerei la vera classe.

Questo problema mi ha rallentato così tante volte durante la scrittura di test sto per lanciare semplicemente il tipo che suggerisce la finestra e controllare invece i nomi di classe, o semplicemente utilizzare gli oggetti di produzione in quanto i mock sono difficili da usare.

+1

Mostra risultati di 'var_dump ($ finto instanceof \ Contratti \ Helper \ iFileSystemWrapper);' dove '$ mock' è ciò che restituisce questo codice – zerkms

+0

' bool (false) '- – Seralize

+0

Questo è strano: -S – zerkms

risposta

-2

È necessario utilizzare una funzione speciale per verificare la classe base. Somthing come questo:

$mock = $this->getMock('MyClass'); 
$this->assertInstanceOf('MyClass', $mock); 
+0

Questo solo verifica che l'oggetto mock sia un'istanza della classe o dell'interfaccia che hai già dato, che in realtà sta solo testando il framework di test :-) Tuttavia se invece usi una normale istruzione 'if' e un operatore' instanceof', allora un l'IDE corretto smetterà di mostrare il suo avviso di "tipo di parametro non valido". – leftclickben

2

Ho appena sperimentato con un controllo esistente di mio, e cambiando il nome dell'interfaccia dello spazio dei nomi da quella che esiste per uno che non esiste, ho avuto esattamente lo stesso di quello che si descrivere (usando phpunit). Il mio oggetto fittizio aveva il nome della classe Mock_ViewInterface_c755461e. Quando lo cambio al nome dell'interfaccia corretta, funziona bene.

Perciò direi che:

  1. Si sta tentando di usare un nome di interfaccia che non esiste (ad esempio un errore di battitura o mancante componente di namespace).
  2. Il codice della libreria non viene caricato per qualche motivo, ad es. l'autoloading non è impostato correttamente nel bootstrap di test dell'unità.