调用 zend db 函数和 reset() 函数的模拟服务

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

所以我创建了一个测试服务集:

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);
    }
}

我的服务看起来像这样,它是对我的 Zend Db 函数的调用:

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();
    }
}

这是我的 Zend DB 函数示例:

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);
        }
    }
}

PHPUnit 的执行出现了一个大问题:

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

我不会在任何地方调用 reset() !这就是问题所在……我认为这是一个 PDO 函数,但是……我有点迷路了。

谢谢。

问题就在这里

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

未初始化的 ResultSet 将没有数据源,运行 其上的 toArray()(就像您在服务中所做的那样)将首先尝试重置数据源,该数据源将为 null。

尝试

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