11
votes

Comment puis-je tester si la même méthode est appelée avec des paramètres corrects avec phpunit et objet mock

J'utilise PHPUnit pour mes tests de l'unité, j'utilise un objet moqueur pour tester si une méthode est appelée avec les paramètres corrects. Cela fonctionne bien lorsque je veux juste faire cela une fois.

    $logMock = $this->getMockBuilder('Logger')
            ->disableOriginalConstructor()
            ->getMock();

    //check if it updates the correct record
    $logMock->expects($this->exactly(1))
            ->method('updateLog')
            ->with(456, 'some status');


0 commentaires

4 Réponses :


18
votes

Je ne connais pas votre cadre moqueur. Habituellement, vous créez une autre attente cependant. Je suppose que cela devrait également travailler avec ce cadre.

$logMock->expects($this->at(0))
        ->method('updateLog')
        ->with(456, 'some status');
$logMock->expects($this->at(1))
         ->method('updateLog')
         ->with(100, 'something else');
$logMock->expects($this->exactly(2))
        ->method('updateLog');


5 commentaires

J'utilise les capacités de simulation interne PHPUnit. À l'intérieur de ma mise en œuvre (la méthode qui est en cours de test), l'UpdateTelog est appelée deux fois, je ne peux donc pas tester les arguments de la méthode avec des attentes différentes.


Selon ce site, vous pouvez y parvenir en utilisant la fonctionnalité d'index des appels. Kreamer. Org / phpunit-Cookbook / 1.0 / Mocks / ...


Merci! Le $ ceci-> at (index) fait le travail. Merci également pour le lien sur le site Web, certaines informations utiles.


L'utilisation d'index est malheureusement pas la meilleure solution. Votre test se cassera si vous réorganisez simplement le code dans votre méthode sans modifier la fonctionnalité réelle. Mais il n'y a vraiment aucune bonne solution pour cela dans le PHPUnit d'aujourd'hui, cela devra donc faire.


Oui, c'est vrai et c'est un bon point. Je n'utilise pas phpunit, je travaille plus dans la section .NET et Java. Et là (par exemple MOQ), vous pouvez ajouter plus d'une attente par méthode sans la nécessité de spécifier un ordre strict.



1
votes

La réponse précédente est correcte.

Vous pouvez trouver la réponse dans le manuel PHPUNIT http: // www .phpunit.de / manuel / 3.6 / fr / phpunit-book.html # test-doubles.mock-objets.tables.matchers Recherche de correspondants. Les correspondants sont les classes renvoyées par les fonctions tout (), jamais () etc. Celui dont vous avez besoin est le phpunit_framework_mockObject_matcher_invokedAindex, renvoyé par la méthode de ()

Vous pouvez en trouver plus en parcourant des classes PHPUnit (Ajouter au chemin du projet et utiliser un IDE comme NetBeans pour y passer et voir ce que vous pouvez utiliser)


0 commentaires

3
votes

AS de PHPUNIT 4.2, vous pouvez utiliser le avec assertion code>. À condition que vous connaissiez l'ordre des appels. Votre moche ressemblerait à ceci:

$logMock->expects($this->exactly(2))
        ->method('updateLog')
        ->withConsecutive(
            array(456, 'some status')
            array(100, 'something else')
        );


0 commentaires

3
votes

retournementCallback

Si vous ne pouvez pas utiliser avecConsecutive () , éventuellement parce que vous êtes sur une ancienne version de phpunit, vous avez une autre option avec RetourCallback .

La fonction returnCallback est appelée chaque fois que votre méthode de maquette est invoquée. Cela signifie que vous pouvez enregistrer les arguments qui lui sont transmis pour une inspection ultérieure. Par exemple: xxx


1 commentaires

Cela m'a littéralement sauvé des heures de googling. Merci.