En essayant de tester une base de code existante, je suis tombé sur un objet qui fait ce qui suit :
class Foo
{
public function __construct($someargs)
{
$this->bar = new Bar();
// [lots more code]
}
}
Bar, dans cet exemple, a un constructeur qui fait quelques mauvaises choses, par exemple se connecter à une base de données. J'essaie de me concentrer sur la mise sous test de cette classe Foo et je l'ai donc changée en quelque chose comme ceci :
class Foo
{
public function __construct($someargs)
{
$this->bar = $this->getBarInstance();
// [lots more code]
}
protected function getBarInstance()
{
return new Bar();
}
}
Et j'ai essayé de le tester via le test PHPUnit suivant :
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));
}
}
Cependant, cela ne fonctionne pas - le constructeur de Foo() est appelé avant que mon ->expects() ne soit ajouté, de sorte que la méthode getBarInstance() simulée renvoie un null.
Existe-t-il un moyen de dissocier cette dépendance sans avoir à remanier la façon dont la classe utilise les constructeurs ?