Lorsque l’on commence à utiliser PHPUnit, il arrive fréquemment que l’on se retrouve face au besoin de simuler une méthode ou un objet. Heureusement PHPUnit a quelques méthodes qui peuvent être très utiles.
Comment simuler un objet
La manière la plus simple de créer un objet mocké
$product = $this->getMockBuilder('Product')
->getMock();
ou
$product = $this->getMockBuilder('Product')
->setMethods(array())
->getMock();
Ce produit est un objet mocké dont les méthodes
- sont toutes présentes
- retournent toujours null par défaut
- sont facilement remplaçables
Si par contre on passe null dans le setMethods
$product = $this->getMockBuilder('Product')
->setMethods(null)
->getMock();
Ce produit est un objet mocké dont les méthodes
- retournent la véritable valeur
- ne sont pas remplaçables
Si l’on passe un array contenant des noms de méthode
$product = $this->getMockBuilder('Product')
->setMethods(array('getName','foobar')
->getMock();
Les méthodes citées
- retournent toujours null par défaut
- sont facilement remplaçables
quant aux autres
- retournent la véritable valeur
- ne sont pas remplaçables
En gros cela signifie que toutes les méthodes de l’objet Product retourneront les valeurs définies sauf getName et foobar qui elles retourneront null.
Si l’on se retrouve face à un constructeur qui empêche de le construire sans connaître quelques valeurs, il est possible d’utiliser l’option disableOriginalConstructor()
$product = $this->getMockBuilder('Product')
->disableOriginalConstructor()
->setMethods(array('getName','foobar')
->getMock();
Comment simuler une méthode
Une fois l’objet mocké, il est aussi possible de remplacer la valeur de retour d’une méthode. Pour ce faire, il suffit d’utiliser la méthode ->expects
$product = $this->getMockBuilder('Product')
->setMethods(array('getName','foobar')
->getMock();
$product->expects($this->once())
->method('getName')
->will($this->returnValue('myName');
$product->expects($this->any())
->method('foobar')
->will($this->returnValue('foo!');
Dans cet exemple, la méthode getName retournera tout le temps la chaîne « myName », mais le test sera un échec si elle est appelée plus d’une fois, alors que l’appel de la méthode foobar est illimité et retourne la chaîne « foo! ».
