2012-05-02 3 views
7

Sto testando un oggetto che restituisce un'istanza di un'altra classe. Internamente, quella classe chiama require_once. Tuttavia, quando cerco di verificare che l'oggetto restituito è di quel tipo ottengo questo messaggio:PHPUnit mi obbliga a richiedere le classi prima di asserire l'istanza di

InvalidArgumentException: Argument #1 of PHPUnit_Framework_Assert::assertInstanceOf() must be a class or interface name 

Questo messaggio va via una volta che io chiamo require_once di nuovo nel mio test prima della chiamata a assertInstanceOf. Questo non sembra giusto. Sembra che PHPUnit dovrebbe essere abbastanza intelligente da sapere che la classe è già stata caricata, quindi non dovrei caricarla di nuovo. Sto pensando a questo torto? Ho configurato correttamente PHPUnit? C'è un modo per evitare di richiedere questa lezione di nuovo nel mio test?

+0

è il 'require_once' necessarie entro il, o nella classe classe stessa del file, al di fuori della categoria, ma caricata quando la classe viene caricato il file? – Malovich

+0

'assertInstanceOf ('MyClass')' NOT 'assertInstanceOf (new MyClass)'. Assicurati di passare una stringa e non un'istanza della classe. –

+0

Sto già passando una stringa – Andrew

risposta

2

L'unità può essere simile a questo:

$this->assertInstanceOf('MyOtherClass', 
    $this->object->someFunctionReturnsOtherClass()); 

Questo va bene, tranne qui, Nota: il metodo phpunit viene chiamato prima l'oggetto. Dal momento che hai detto che il tuo oggetto è già internamente un require_once significa che fino a quando il tuo metodo non viene chiamato, 'MyOtherClass' rimane come una classe indefinita. Questo è esattamente quello che è successo. La funzione Phpunit è stata preparata per controllare usando 'MyOtherClass' e ha scoperto che non è definito!

L'oggetto require_once non è mai stato chiamato. Questo è il motivo per cui devi prima chiamarti. È simile se si utilizza una dichiarazione come true == $returnObject instanceOf MyOtherClass che restituirà lo stesso errore poiché durante l'analisi di PHP non è riuscito a trovare la definizione della classe.

22

Assicurarsi di utilizzare l'intero spazio dei nomi:

$this->assertInstanceOf('\Namespace\Subnamespace\MyClass', $obj);