Quando eseguo il test unitario del mio codice php con PHPUnit, sto cercando di capire il modo giusto di prendere in giro un oggetto senza prendere in giro nessuno dei suoi metodi.Creare una simulazione in phpunit senza prendere in giro alcun metodo?
Il problema è che se non chiamo getMockBuilder()->setMethods()
, tutti i metodi sull'oggetto verranno derisi e non posso chiamare il metodo che voglio testare; ma se I do chiama setMethods()
, allora ho bisogno di dirgli quale metodo usare per deridere, ma non voglio affatto prendere in giro alcun metodo. Ma ho bisogno di creare il mock in modo da evitare di chiamare il costruttore nel mio test.
Ecco un esempio banale di un metodo che vorrei prova:
class Foobar
{
public function __construct()
{
// stuff happens here ...
}
public function myMethod($s)
{
// I want to test this
return (strlen($s) > 3);
}
}
potrei provare myMethod()
con:
$obj = new Foobar();
$this->assertTrue($obj->myMethod('abcd'));
Ma questo potrebbe chiamare il costruttore di Foobar, che non mi volere. Così, invece mi piacerebbe provare:
$obj = $this->getMockBuilder('Foobar')->disableOriginalConstructor()->getMock();
$this->assertTrue($obj->myMethod('abcd'));
Ma chiamando getMockBuilder()
senza utilizzare setMethods()
si tradurrà in tutti i suoi metodi di essere derisi e ritorno nullo, quindi la mia chiamata a myMethod()
restituirà nulla senza toccare il codice che ho intenzione di provare.
mia soluzione finora è stato questo:
$obj = $this->getMockBuilder('Foobar')->setMethods(array('none'))
->disableOriginalConstructor()->getMock();
$this->assertTrue($obj->myMethod('abcd'));
Ciò deridere un metodo chiamato 'none', che non esiste, ma PHPUnit non se ne cura. Lasciamo myMethod() sbloccato in modo che possa chiamarlo, e mi consentirà anche di disabilitare il costruttore in modo che non lo chiami. Perfezionare! Solo che sembra che barare debba specificare un nome di metodo che non esiste - "nessuno", o "blargh" o "xyzzy".
Quale sarebbe il modo giusto per farlo?
Grazie mille! Sembra che setMethods (null) sia quello che voglio; questo non causa alcun metodo per essere deriso. setMethods (array()), d'altra parte, sembra causare la derisione di tutti i metodi, come non usare setMethods(). Non ho potuto trovare questo documentato ovunque. Cosa intendi per "genitori vuoti"? –
Inoltre, sono perplesso dal tuo commento. A parte le specifiche del banale esempio myMethod() che ho fornito sopra, perché un metodo che deve essere testato in questo modo ti fa sentire che il metodo dovrebbe essere spostato su un'altra classe o reso statico? –
@BrianKendig - Errore di correzione automatica su "genitori" che dovrebbero essere "parenti". :) Ho appena controllato il codice sorgente e non ci sono impostazioni predefinite, quindi devi passare in 'null' da solo. –