De qui se moque-t’on ?

Derrière ce titre un peu faible, se cache un billet qui va, potentiellement, changer votre vie. Pour autant que vous écriviez des tests unitaires (mais tout le monde fait ça ici non ? en tout cas on en fait chez PMSIpilot …). En effet, je vais vous parler d’un truc génial: Mockery. Mockery, c’est un framework de Mock (il parait qu’on dit Bouchon en français, mais c’est vraiment trop ridicule), écrit par Pádraic Brady, qui fait partie de la core team du Zend Framework. Du lourd quoi.

Bon, mais d’abord, pour les nouveaux, qu’est-ce donc qu’un Mock ? Je ne saurais mieux l’expliquer que Padraic dans son superbe blogpost, mais pour les pressés, on va faire une version courte. Un mock est un remplacement d’objet pour isoler un test. Par exemple, on peut créer des mocks de base de données pour éviter d’instancier tout Propel a chaque test. Voilà, ça c’est pour la théorie.

Toujours pas clair ? Un petit exemple alors. Tout à l’heure j’ai écris des tests (disons pour une classe qui s’appellerait Foobar). C’est une super classe, qui fait son job, pas de problème, mais qui demande en constructeur 2 objets: un Foo et un Bar. Disons que Foo et Bar coûtent un peu cher à instancier. J’ai donc 2 choix: instancier des vrais objets (c’est mal, mais c’est qu’on fait en général), ou utiliser des mocks (c’est bien, mais on le fait pas parcequ’on a la flemme d’écrire les mocks). Qu’à cela ne tienne, avec Mockery, c’est fait en 2 coups de cuiler a pot:
$foo = Mockery::mock('Foo', array('getCreatedAt' => date('Y-m-d H:i:s'));
$bar = Mockery::mock('Bar', array(
'getIsSaved' => true,
'getTitle' => 'recherche titre',
'getDescription' => 'recherche description',
'getIsPublic'=> true ));
$object = new Foobar($foo, bar);
Donc ça c’est la forme un peu « rapide » de création de mock. Pour chaque méthode que je spécifie dans l’array d’options, mockery assigne en valeur de retour la valeur en face. Donc $recherche->getTite() renverra « recherche titre » par exemple. C’est cool non ? Bien sur on peut aller super loin avec Mockery, comme par exemple dire « la méthode tartenpion de l’objet pmsipilotUser doit etre appelé avec en paramètre perlinpinpin et renvoyer un objet MerlinLenchanteur et ne doit être utilisée qu’une fois sinon la terre explose »:
$merlin = new MerlinLenchanteur();
$user = Mockery::mock('pmsipilotUser');
$user->shouldReceive('tartenpion')->with('perlinpinpin')->once()->andReturn($merlin);
(ok je triche encore un peu on ne peut pas vraiment faire exploser la terre) Par contre si on veut vérifier que tout a bien été appelé comme on l’a défini, il ne faut pas oublier de le dire a la fin: Mockery::close(); Un dernier exemple pour vous convaincre de la puissance de Mockery. On rencontre souvent du code qui viole la Loi de Demeter, et qui de fait devient difficile à tester. Point de chichi avec Mockery, car il permet aussi de Mocker une chaine d’appels complète très simplement: $mock = Mockery::mock('demeter'); $mock->shouldReceive('foo->bar->quux->roflpwn->demeter')->andReturn('omgponies'); Magique non ? Pour encore plus de trucs magiques, je vous invite à lire la doc sur la page github de mockery. Voilà j’espère que ça vous aura donné envie d’utiliser un peu plus de Mocks dans vos tests :-)

 

Serv-Tech

 

2 thoughts on “De qui se moque-t’on ?

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *