Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 27-05-2015 10:50:53

amelie
Membre
Lieu: Marseille
Date d'inscription: 05-02-2013
Messages: 113
Site web

[Resolu] Mocker une instance de SQL

Bonjour, encore un souci avec php unit smile

Voici ma fonction, un count tout bête :

Code:

[lang=php]
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:

[lang=php]
public function testCountAttReturnsNumberOfAtt() 
{
    $resultSet = new ResultSet();
     
    $mockSql = $this->getMock('Zend\Db\Sql\Sql', array(), array('getAdapter','select'), '', false);
    $mockSql->expects($this->once())
        ->method('getAdapter')
        ->with()
        ->will($this->returnValue($mockSql));
        
    $mockTableGateway = $this->getMock('Zend\Db\TableGateway\TableGateway',
        array('getSql', 'select'), array(), '', false);
    $mockTableGateway->expects($this->once())
        ->method('getSql')
        ->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

Dernière modification par amelie (29-05-2015 10:20:27)

Hors ligne

 

#2 28-05-2015 08:56:06

amelie
Membre
Lieu: Marseille
Date d'inscription: 05-02-2013
Messages: 113
Site web

Re: [Resolu] Mocker une instance de SQL

Bon je pense que je vais pas tarder à pleurer :'(

Hors ligne

 

#3 28-05-2015 10:35:02

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Re: [Resolu] Mocker une instance de SQL

Bonjour,

Plus je passe du temps a réaliser mes tests unitaires sur ZF2, plus je me dis qu'il manque vraiment quelque chose de ce côté en terme de ressources sur le net, pour progresser et comprendre. Alors en plus quand on débute en TU c'est inbuvable pour apprendre dans son coin.

De ce que je vois, tu devrais essayer la méthode getMockBuilder avec la méthode qui suit : setConstructorArgs qui te permet en gros de lui passer des dépendances, et c'est la dessus que tu vas lui envoyer un mock de ton adapterInterface avec ton getAdapter mocké..


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#4 28-05-2015 14:15:20

amelie
Membre
Lieu: Marseille
Date d'inscription: 05-02-2013
Messages: 113
Site web

Re: [Resolu] Mocker une instance de SQL

JGreco a écrit:

Bonjour,

Plus je passe du temps a réaliser mes tests unitaires sur ZF2, plus je me dis qu'il manque vraiment quelque chose de ce côté en terme de ressources sur le net, pour progresser et comprendre. Alors en plus quand on débute en TU c'est inbuvable pour apprendre dans son coin.

Salut, ça me rassure de voir que je ne suis pas seule smile

Dernière modification par amelie (28-05-2015 14:16:12)

Hors ligne

 

#5 28-05-2015 14:41:53

amelie
Membre
Lieu: Marseille
Date d'inscription: 05-02-2013
Messages: 113
Site web

Re: [Resolu] Mocker une instance de SQL

J'ai essayé ça :

Code:

[lang=php]
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());
    }

mais visiblement j'ai toujours le meme bug, SQL demande son argument :s

Dernière modification par amelie (28-05-2015 15:03:03)

Hors ligne

 

#6 29-05-2015 10:17:45

amelie
Membre
Lieu: Marseille
Date d'inscription: 05-02-2013
Messages: 113
Site web

Re: [Resolu] Mocker une instance de SQL

Youpi tralala j'ai trouvé !!! big_smile

Alors j'ai mis dans ma classe de test un setup() où j'ai instancié mes mocks à la queue leuleu :

Code:

[lang=php]
protected function setUp()
    {
        $this->mockDriver = $this->getMock('Zend\Db\Adapter\Driver\DriverInterface');
        $this->mockConnection = $this->getMock('Zend\Db\Adapter\Driver\ConnectionInterface');
        $this->mockDriver->expects($this->any())->method('checkEnvironment')->will($this->returnValue(true));
        $this->mockDriver->expects($this->any())->method('getConnection')->will($this->returnValue($this->mockConnection));
        $this->mockPlatform = $this->getMock('Zend\Db\Adapter\Platform\PlatformInterface');
        $this->mockStatement = $this->getMock('Zend\Db\Adapter\Driver\StatementInterface');
        $this->mockDriver->expects($this->any())->method('createStatement')->will($this->returnValue($this->mockStatement));
        $this->adapter = new Adapter($this->mockDriver, $this->mockPlatform);    
    }

Et dans mon test j'ai instancié mon mock Sql :

Code:

[lang=php]
$mockSql = $this->getMockBuilder('Zend\Db\Sql\Sql')
            ->setConstructorArgs(array($this->adapter))
            ->getMock();

Alors j'ai quand même amené des réaménagements dans ma classe de table comme ça je passe mes deux mocks dans le constructeur de ma table :

$attestTable = new AttTable($mockTableGateway,$mockSql);

It works. *happy*

Dernière modification par amelie (29-05-2015 10:19:28)

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages