2 votes

Supprimer une dépendance dans un constructeur en utilisant PHPunit

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 ?

4voto

Ionuț G. Stan Points 62482

Utiliser le $callOriginalConstructor argument de getMock() . Réglez-le sur false . C'est le cinquième argument de la méthode. Consultez-le ici : http://www.phpunit.de/manual/current/en/api.html#api.testcase.tables.api

En fait, attendez. Vous voulez passer un simulacre à un simulacre ? Si vous voulez vraiment cela, utilisez le troisième argument de getMock qui représente les arguments du constructeur. Vous pouvez y passer les simulacres de Bar à la moquerie de Foo .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X