Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour, encore un souci avec php unit
Voici ma fonction, un count tout bête :
[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 :
[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
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é..
Hors ligne
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
Dernière modification par amelie (28-05-2015 14:16:12)
Hors ligne
J'ai essayé ça :
[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
Youpi tralala j'ai trouvé !!!
Alors j'ai mis dans ma classe de test un setup() où j'ai instancié mes mocks à la queue leuleu :
[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 :
[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