Fantaisie dans PHPUnit - les différentes configurations de la même méthode avec des arguments différents
Il est possible de configurer PHPUnit se moquer de cette façon?
$context = $this->getMockBuilder('Context')
->getMock();
$context->expects($this->any())
->method('offsetGet')
->with('Matcher')
->will($this->returnValue(new Matcher()));
$context->expects($this->any())
->method('offsetGet')
->with('Logger')
->will($this->returnValue(new Logger()));
Je utiliser PHPUnit 3.5.10 et il ne parvient pas quand je demande pour Matcher parce qu'il s'attend à "Logger" argument.
C'est comme la deuxième attente est la réécriture de la première, mais quand je dump la maquette, tout à l'air ok.
Vous devez vous connecter pour publier un commentaire.
De PHPUnit 3.6, il est
$this->returnValueMap()
qui peut être utilisé pour retourner des valeurs différentes selon les paramètres donnés à la méthode de stub.Malheureusement, ce n'est pas possible avec la valeur par défaut de PHPUnit se Moquer de l'API.
Je vois deux options qui vous permet d'être proche de quelque chose comme ceci:
Aide ->at($x)
Cela fonctionne bien, mais vous êtes essais de plus que vous devriez (surtout qu'elle est appelée à matcher tout d'abord, et c'est un détail d'implémentation).
Aussi ceci ne fonctionnera pas si vous avez plus d'un appel à chacun des des fonctions!
D'accepter à la fois les paramètres et l'utilisation de returnCallBack
C'est plus de travail, mais fonctionne plus agréable puisque vous ne dépendent pas de l'ordre des appels:
De travail exemple:
Ce sera de sortie:
J'ai utilisé
$this->exactly(2)
dans le comparateur de montrer que ce ne travaillons également avec le comptage des invocations. Si vous n'avez pas besoin de les échanger pour$this->any()
sera, bien sûr, le travail.Matcher
comme argument et qui n'est jamaisLogger
comme argument et il serait encore passer. Selon le test qui pourrait être un problème. Comment travaillez-vous autour de ce que, sans fuite de l'ordre dans le cas de test?Vous pouvez réaliser cela avec un rappel:
Doit passer pour n'importe quel "Logger" ou de "Matcher" les arguments passés au Contexte Mock
offsetGet
méthode:Comme vous pouvez le voir, PHPUnit a couru deux tests. Un pour chaque dataProvider valeur. Et dans chacun de ces tests, il fait de l'affirmation de
with()
et l'un pourinstanceOf
, donc quatre affirmations.À la suite de la réponse de @edorian et les commentaires (@MarijnHuizendveld) pour s'assurer que la méthode est appelée avec deux Matcher et l'Enregistreur de données, et pas simplement deux fois avec soit Matcher ou Logger, voici un exemple.
C'est avec PHPUnit 3.7.
Si la méthode de test ne retourne rien, et vous avez simplement besoin de tester qu'il est appelé avec les bons arguments, la même approche s'applique. Pour ce scénario, j'ai également essayé de faire cela en utilisant une fonction de rappel pour $this->rappel que l'argument de la avec le, plutôt que de returnCallback dans la volonté. Cela ne parvient pas, en interne, phpunit appelle le callback deux fois dans le processus de vérification de l'argument comparateur de rappel. Cela signifie que l'approche ne tient pas que sur le deuxième appel à cet argument a déjà été retiré de la arguments attendus tableau. Je ne sais pas pourquoi phpunit l'appelle deux fois (semble un gaspillage inutile), et je pense que l'on peut contourner ce problème en n'enlevant que sur l'appel de la deuxième, mais je n'étais pas assez sûr de lui que ce qui est prévu et conforme phpunit comportement de s'appuyer sur ce produit.
Mes 2 cents pour le sujet: attention lors de l'utilisation à($x): cela signifie que prévu appel de la méthode sera l' ($x+1)ème appel de méthode sur l'objet fantaisie; cela ne signifie pas que ce sera la ($x+1)ème appel de la méthode. Cela m'a fait perdre quelques temps donc j'espère que ce ne sera pas avec vous. Salutations à tout le monde.
Je viens de tombé sur cette extension PHP pour les objets fantaisie: https://github.com/etsy/phpunit-extensions/wiki/Mock-Object
Voici également quelques solutions avec le doublit bibliothèque :
Solution 1 : utilisation de
Stubs::returnValueMap
Solution 2 : utiliser un rappel