web-dev-qa-db-fra.com

Comment se moquer du service Symfony 2 dans un test fonctionnel?

J'ai le service symfony qui utilise la connexion redis dans certaines méthodes mais pas dans toutes les méthodes.

class ServiceA
{
    private $redis;

    public function __construct($redis)
    {
        $this->redis = $redis;
    }

    public function getRequest($param1, $param2)
    {
    $result = $param1+ $param2;
        return $request;
    }

    .. other methods which use $redis connection
}

J'écris un test fonctionnel pour le code qui utilise uniquement la méthode getRequest (cette méthode n'a pas besoin d'une connexion redis) mais comme le constructeur prend la connexion en argument, lorsque je lance le test, il a essayé de connecter le serveur redis.

Comment puis-je écrire un service fictif qui n'utilise pas du tout la connexion redis et ignore le constructeur d'origine.

J'essaie l'approche mentionnée ci-dessous mais sans succès. Il essaie toujours de se connecter redis même si j'ai désactivé le constructeur d'origine.

http://blog.lyrixx.info/2013/04/12/symfony2-how-to-mock-services-during-functional-tests.html

$serviceA = $this->getMockBuilder('ServiceA')
    ->disableOriginalConstructor()
    ->getMock();

static::$kernel->getContainer()->set('my_bundle.service.a', $serviceA);
28
vishal

Après avoir créé ServiceA mock, vous devez le passer au conteneur du client (pas celui du noyau car l'objet client construit son propre noyau). Essaye ça:

$client = self::createClient();

$serviceA = $this->getMockBuilder('ServiceA')
    ->disableOriginalConstructor()
    ->getMock();

$client->getContainer()->set('my_bundle.service.a', $serviceA);

Faites attention, vous devez injecter ce service simulé à chaque fois que vous faites une demande. C'est parce que le client reconstruit le noyau entre chacune des deux requêtes.

59
Cyprian

Vous ne devez pas vous moquer de votre classe testée, vous devez vous moquer de la classe Redis et l'injecter.

Si Redis n'est pas utilisé pour ce test, vous n'avez même pas besoin de configurer la maquette.

$redis = $this->getMockBuilder('Redis')->disableOriginalConstructor()->getMock();
$serviceA = new ServiceA($redis);
5
Sven

Il existe un outil spécial qui s'occupe des services simulés - https://github.com/ramunasd/symfony-container-mocks

C'est simple comme ça:

$service = static::$kernel->getContainer()->prophesize('my.custom.service');
4
Ramunas Dronga

As-tu essayé ?

$serviceA = $this->getMock('ServiceA', array('getRequest'), array(), '', false);
0
adam187