169 votes

Comment puis-je obtenir PHPUnit MockObjects pour retourner des valeurs differernt reposant sur un paramètre ?

J'ai un PHPUnit objet fantaisie qui renvoie "valeur de retour" n'importe quoi ses arguments:

// From inside a test...
$mock = $this->getMock('myObject', 'methodToMock');
$mock->expects($this->any))
     ->method('methodToMock')
     ->will($this->returnValue('return value'));

Ce que je veux être en mesure de faire est de renvoyer une valeur différente en fonction sur les arguments passés à la simulation de la méthode. J'ai essayé quelque chose comme:

$mock = $this->getMock('myObject', 'methodToMock');
// methodToMock('one')
$mock->expects($this->any))
     ->method('methodToMock')
     ->with($this->equalTo('one'))
     ->will($this->returnValue('method called with argument "one"'));
// methodToMock('two')
$mock->expects($this->any))
     ->method('methodToMock')
     ->with($this->equalTo('two'))
     ->will($this->returnValue('method called with argument "two"'));

Mais cela provoque PHPUnit à se plaindre si la maquette n'est pas appelée avec l'argument "deux", donc je suppose que la définition de methodToMock ("deux"), qui remplace la définition de la première.

Donc ma question est: Est-il possible d'obtenir un PHPUnit objet fantaisie pour renvoyer une valeur différente basée sur ses arguments? Et si oui, comment?

Merci à l'avance!

141voto

Howard Sandford Points 720

Utiliser un rappel. par exemple (directement à partir de la documentation de PHPUnit) :

Procéder à quelque traitement souhaité dans le callback() et retourner le résultat basé sur votre $args selon le cas.

136voto

Nikola Ivancevic Points 161

Depuis les dernières docs phpUnit : « parfois une stub de méthode doit retourner des valeurs différentes selon une liste prédéfinie d’arguments. Vous pouvez utiliser returnValueMap() pour créer une carte qui associe des arguments avec des valeurs de retour correspondantes. »

54voto

Adam Points 219

J’ai eu un problème similaire (bien que légèrement différente... J’ai n’a pas valeur de retour différente, fondée sur des arguments, mais devait tester pour s’assurer que les 2 séries d’arguments ont été passés à la même fonction). J’ai trébuché sur en utilisant quelque chose comme ceci :

Il n’est pas parfait, car il nécessite que l’ordre des 2 appels à foo() est connue, mais en pratique cela n’est probablement pas trop mauvais.

30voto

Francis Lewis Points 3379

Vous voulez probablement faire un rappel dans un mode de programmation orientée objet :

25voto

Prokhor Sednev Points 1

Ce n’est pas exactement ce que vous demandez, mais dans certains cas, il peut aider :

onConsecutiveCalls - retourne une liste de valeurs dans l’ordre spécifié

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