J'ai un objet simulé PHPUnit qui renvoie 'return value'
quels que soient 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 pouvoir faire, c'est renvoyer une valeur différente en fonction des arguments passés à la méthode fictive. 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 amène PHPUnit à se plaindre si le mock n'est pas appelé avec l'argument 'two'
, donc je suppose que la définition de methodToMock('two')
écrase la définition de la première.
Ma question est donc la suivante: existe-t-il un moyen d'obtenir un objet simulé PHPUnit pour renvoyer une valeur différente en fonction de ses arguments? Et si oui, comment?
la source
$this->returnCallback(array('MyClassTest','myCallback'))
.$this->returnCallback(function() { // ... })
D'après la dernière documentation de phpUnit: "Parfois, une méthode stubbed doit renvoyer des valeurs différentes selon une liste d'arguments prédéfinie. Vous pouvez utiliser returnValueMap () pour créer une carte qui associe des arguments aux valeurs de retour correspondantes."
la source
J'ai eu un problème similaire (bien que légèrement différent ... je n'avais pas besoin de valeur de retour différente en fonction des arguments, mais j'ai dû tester pour m'assurer que 2 ensembles d'arguments étaient passés à la même fonction). Je suis tombé sur l'utilisation de quelque chose comme ceci:
Ce n'est pas parfait, car cela nécessite que l'ordre des 2 appels à foo () soit connu, mais en pratique ce n'est probablement pas trop mal.
la source
Vous voudrez probablement faire un rappel en mode POO:
la source
Ce n'est pas exactement ce que vous demandez, mais dans certains cas, cela peut aider:
onConsecutiveCalls - renvoie une liste de valeurs dans l'ordre spécifié
la source
Passez un tableau à deux niveaux, où chaque élément est un tableau de:
exemple:
la source
Vous pouvez également renvoyer l'argument comme suit:
Comme vous pouvez le voir dans la documentation Mocking , la méthode
returnValue($index)
permet de retourner l'argument donné.la source
Voulez-vous dire quelque chose comme ça?
la source
J'ai eu un problème similaire que je ne pouvais pas résoudre non plus (il y a étonnamment peu d'informations sur PHPUnit). Dans mon cas, je viens de faire chaque test test séparé - entrée connue et sortie connue. J'ai réalisé que je n'avais pas besoin de créer un objet simulé touche-à-tout, je n'avais besoin que d'un objet spécifique pour un test spécifique, et j'ai donc séparé les tests et je peux tester des aspects individuels de mon code séparément. unité. Je ne sais pas si cela peut s'appliquer à vous ou non, mais c'est ce que vous devez tester.
la source
la source
Essayez:
la source