Per gli oggetti che compongono un altro oggetto come parte della loro implementazione, qual è il modo migliore per scrivere il test unitario in modo da testare solo l'oggetto principale? Esempio banale:Test degli oggetti con dipendenze in PHPUnità
class myObj {
public function doSomethingWhichIsLogged()
{
// ...
$logger = new logger('/tmp/log.txt');
$logger->info('some message');
// ...
}
}
So che l'oggetto potrebbe essere progettato in modo tale che la dipendenza oggetto logger potrebbe essere iniettato e, quindi, preso in giro in un test di unità, ma non è sempre il caso - in scenari più complessi, si ha bisogno comporre altri oggetti o effettuare chiamate a metodi statici.
Dato che non vogliamo testare l'oggetto logger, solo il myObj, come procedere? Creiamo un "doppio" stoppato con lo script di test? Qualcosa di simile:
class logger
{
public function __construct($filepath) {}
public function info($message) {}
}
class TestMyObj extends PHPUnit_Framework_TestCase
{
// ...
}
Questo sembra fattibile per piccoli oggetti, ma sarebbe un dolore per le API più complesse dove il SUT dipendeva dai valori di ritorno. Inoltre, cosa succede se si desidera testare le chiamate all'oggetto dipendenza nello stesso modo in cui è possibile con oggetti mock? C'è un modo di deridere oggetti che sono istanziati dal SUT piuttosto che essere passati dentro?
Ho letto la pagina man sui mock ma non sembra coprire questa situazione in cui la dipendenza è composta piuttosto che aggregata. Come si fa?
Hai guardato PHPUnit che ha introdotto le dipendenze di prova e quindi riutilizzare apparecchio dal 3.4? http://sebastian-bergmann.de/archives/848-Fixture-Reuse-in-PHPUnit-3.4.html Cheers Markus –