IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend Framework PHP Discussion :

[ZF 2] PHPUnit et Mock


Sujet :

Zend Framework PHP

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 22
    Points : 18
    Points
    18
    Par défaut [ZF 2] PHPUnit et Mock
    Bonjour, j'ai un souci avec PHPUnit

    Voici ma fonction, un count tout bête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public function countAtt()
    {
        try {
            $sql = new Sql($this->adapter);
            $select = new Select();
            $select->from('table1');
            $select->join('table2', 'join1 = table2.join2', array('syndic' => 'nom'));
            $select->columns(array('num' => new \Zend\Db\Sql\Expression('COUNT(*)')));
     
            $statement = $sql->prepareStatementForSqlObject($select);
            $result = $statement->execute();
     
            $num = $result->current();
            return $num["num"];
        } catch (\Exception $e) {
            throw new \Exception($e);
        }
    }
    Et mon test, que j'ai remanié dans tous les sens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    public function testCountAttReturnsNumberOfAtt()
        {
            $resultSet = new ResultSet();
     
            $mockDriver = $this->getMockBuilder('Zend\Db\Adapter\Driver\DriverInterface')->getMock();
     
     
            $mockAdapter = $this->getMockBuilder('Zend\Db\Adapter\AdapterInterface')
                ->setConstructorArgs(array($mockDriver))
                ->getMock();
     
     
            $mockSql = $this->getMockBuilder('Zend\Db\Sql\Sql')
                ->setConstructorArgs(array($mockAdapter))
                ->getMock();
     
            $mockTableGateway = $this->getMock('Zend\Db\TableGateway\TableGateway',
                array('getSql', 'select'), array(), '', false);
            $mockTableGateway->expects($this->once())
                ->method('select')
                ->with()
                ->will($this->returnValue($mockSql));
     
            $mockTableGateway->expects($this->once())
                ->method('select')
                ->with($mockSql)
                ->will($this->returnValue($resultSet));
     
            $attTable = new AttTable($mockTableGateway);
            $this->assertSame($resultSet, $attTable->countAtt());
        }
    Bon, le test est pas peaufiné puisqu'il fait juste un select mais ça aurait été une erreur normale.
    Là, j'ai cette fichue erreur :

    Exception: Argument 1 passed to Zend\Db\Sql\Sql::__construct() must implement in
    terface Zend\Db\Adapter\AdapterInterface, null given, called in (chemin du script) on
    line 40 and defined

    Je sais pas comment mocker ce fichu AdapterInterface :s est-ce que quelqu'un pourrait m'aider svp ? :s

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Bonsoir,

    Regarde cette méthode setup() pour t'inspirer de la façon dont Zend fait ses tests. Tu peux aussi regarder les autres tests si ça ne te convient pas, tu devrais trouver ton bonheur.

    Pour isoler ta méthode, il est peut-être préférable de déplacer la création de l'objet Sql dans une méthode factory, et d'injecter cet objet dans countAtt avec countAtt(Sql $sql). Ça te permettra de tester séparément la création de l'objet Sql (qui est ton problème ici) et la méthode countAtt, au lieu de tester Sql implicitement comme tu le fais maintenant.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Super, merci pour ce setup() qui m'a bien facilité la vie. Je l'ai mise dans mon test et je l'ai passé mon $this->adapter dans mon mock :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $mockSql = $this->getMockBuilder('Zend\Db\Sql\Sql')
                ->setConstructorArgs(array($this->adapter))
                ->getMock();
    Et ça marche !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHPUnit] Contrôle de retour de valeur de MOCK objects
    Par razam dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 14/04/2015, 16h23
  2. [test] Limites des outils Jmeter , JUnit, PhpUnit ?
    Par foufa007 dans le forum Outils
    Réponses: 5
    Dernier message: 19/06/2007, 11h12
  3. différents tests Junit/Mock objects
    Par LESOLEIL dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 09/05/2006, 17h28
  4. Test avec Junit, Mock
    Par LESOLEIL dans le forum Tests et Performance
    Réponses: 2
    Dernier message: 27/03/2006, 18h03
  5. [ mock-objects ]
    Par hocinema dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 13/11/2005, 08h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo