Rimozione di una dipendenza in un costruttore mediante PHPunit
-
07-07-2019 - |
Domanda
Durante il tentativo di testare una base di codice legacy, mi sono imbattuto in un oggetto che procede come segue:
class Foo
{
public function __construct($someargs)
{
$this->bar = new Bar();
// [lots more code]
}
}
La barra in questo caso ha un costruttore che fa delle cose cattive, ad es. connettersi a un database. Sto cercando di concentrarmi su come testare questa classe Foo, quindi l'ho cambiata in qualcosa del genere:
class Foo
{
public function __construct($someargs)
{
$this->bar = $this->getBarInstance();
// [lots more code]
}
protected function getBarInstance()
{
return new Bar();
}
}
E ho provato a testarlo tramite il seguente test PHPUnit:
class FooTest extends PHPUnit_Framework_TestCase
{
public function testInstance()
{
$bar = $this->getMock('Bar');
$foo = $this->getMock('Foo', array('getBarInstance'));
$foo->expects($this->any())
->method('getBarInstance')
->will($this->returnValue($bar));
}
}
Comunque questo non funziona - il costruttore di Foo () viene chiamato prima che venga aggiunto my - > Expects (), quindi il metodo getBarInstance () beffato restituisce un valore nullo.
Esiste un modo per scollegare questa dipendenza senza dover riformattare il modo in cui la classe usa i costruttori?
Soluzione
Usa l'argomento $ callOriginalConstructor
di getMock ()
. Impostalo su false
. È il quinto argomento del metodo. Cerca qui: http: // www .phpunit.de / manuale / corrente / it / API.html # api.testcase.tables.api
In realtà, aspetta. Vuoi passare un finto a un finto? Se lo vuoi davvero, usa il terzo argomento di getMock
che rappresenta gli argomenti per il costruttore. Lì puoi passare la derisione di Bar
alla derisione di Foo
.