Search code examples
phpzend-framework2phpunitzend-db

Mocking services which calls a zend db function and reset() function


So I created a test service set :

class FMaiAffaireServiceTest extends TestCase
{
    /**
     * @var MyService
     */
    private $myService;
    private $typeaffaireTable;

    private $mockDriver;
    private $mockConnection;
    private $mockPlatform;
    private $mockStatement;
    private $adapter;
    private $sql;

    public 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);
        $this->sql = new Sql($this->adapter);

        $mockTableGateway = $this->getMock('Zend\Db\TableGateway\TableGateway', array(), array(), '', false);

        $maiAffaireTable = $this->getMockBuilder('Maintenance\Model\BDD\FMaiAffaireTable')
                                ->setMethods(array())
                                ->setConstructorArgs(array($mockTableGateway, $this->adapter, $this->sql))
                                ->getMock();

        $stub = $this->returnValue(new ResultSet());
        $maiAffaireTable->expects($this->any())->method('listAffaires')->will($stub);


        $this->myService = new FMaiAffaireService(
            $maiAffaireTable
        );
    }

    public function testListAffaires()
    {
        $this->myService->listAffaires(1,10);
    }
}

My service looks like this, it is a call to my Zend Db function :

class FMaiAffaireService
{
    private $maiAffaireTable;


    public function __construct(
        $maiAffaireTable,
    ) {
        $this->maiAffaireTable      = $maiAffaireTable;
    }

    public function listAffaires($iOffset, $iLimit) {
        $aResults = $this->maiAffaireTable->listAffaires($iOffset, $iLimit);
        return $aResults->toArray();
    }
}

And here is the sample of my Zend DB function :

class FMaiAffaireTable
{
    protected $tableGateway;
    protected $adapter;
    protected $sql;

    public function __construct(
        TableGateway $tableGateway,
        Adapter $adapter,
        Sql $sql
    ) {
        $this->tableGateway = $tableGateway;
        $this->adapter      = $adapter;
        $this->sql          = $sql;
    }

    public function listAffaires($iOffset, $iLimit)
    {
        try {
            $resultSet = $this->tableGateway->select(
                function (Select $select) use (
                    $iOffset,
                    $iLimit
                ) {
                    $select->offset($iOffset);
                    $select->limit($iLimit);
                }
            );
            return $resultSet;
        } catch (\Exception $e) {
            throw new \Exception($e);
        }
    }
}

And there is a big problem at the execution of PHPUnit :

1) Directories\FMaiAffaireServiceTest::testListAffaires reset() expects parameter 1 to be array, null given

I don't call reset() ANYWHERE ! That's the problem ... I think it's a PDO function but ... I'm a bit lost.

Thanks.


Solution

  • The problem is here

    $stub = $this->returnValue(new ResultSet());
    $maiAffaireTable->expects($this->any())->method('listAffaires')->will($stub);
    

    A non-initialized ResultSet will not have a datasource, running toArray() on it (as you do in your service) will first try and reset the datasource, which will be null.

    Try

    $resultSet = new ResultSet();
    $resultSet->initialize(array());
    $stub = $this->returnValue($resultSet);