PHPUnit和名称空间 - 仍在调用模拟方法

时间:2014-09-16 14:24:56

标签: php unit-testing phpunit

我正在将单元测试添加到使用命名空间的现有项目中。我以前从未使用名称空间,所以这有点冒险。我的问题是,在我的单元测试中,似乎仍在调用模拟的方法。下面是代码文件和测试的示例。

private function selectFromDb($fields, $criteria = null) {
    $fields = is_array($fields) ? implode(', ', $fields) : $fields;

    $sql = "SELECT $fields FROM balloons";

    if(!is_null($criteria)) {
        $sql .= " WHERE $criteria";
    }

    $adapter = $this->getAdapter();
    $statement = $adapter->query($sql);
    $result = $statement->execute();

    return $result;
}

这是测试代码:

// I'm passing in data here which isn't consequential for the question.
public function testSelectFromDb($fields, $criteria, $expectedSql) {
    $statement = $this->getMockBuilder('Zend\Db\Adapter\Driver\Pdo\Statement')
        ->disableOriginalConstructor()
        ->setMethods(array('execute'))->getMock();
    $statement->expects($this->once())
        ->method('execute')->will($this->returnValue('fake'));

    $adapter = $this->getMockBuilder('Zend\Db\Adapter\Adapter')
        ->disableOriginalConstructor()
        ->setMethods(array('query'))->getMock();
    $adapter->expects($this->once())
        ->method('query')->with($expectedSql)
        ->will($this->returnValue($statement));

    $bm = $this->getMockBuilder('Application\Model\BalloonModel')
        ->setMethods(array('getAdapter'))
        ->disableOriginalConstructor()->getMock();
    $bm->expects($this->once())
        ->method('getAdapter')->will($this->returnValue($adapter));

    // I use reflection as the method is private to the class
    $reflection = new ReflectionClass($bm);
    $method = $reflection->getMethod('selectFromDb');
    $method->setAccessible(true);

    $result = $method->invokeArgs($bm, array($fields, $criteria));

}

此时,我只是想让测试执行到最后,但我继续得到以下错误:

Tests\Model\BalloonModelTest::testSelectFromDb with data set "singleField" ('id', NULL, 'SELECT id FROM balloon')
    Zend\Db\Adapter\Exception\InvalidQueryException: Statement could not be executed

/apath/PHP/vendor/zendframework/zendframework/library/zend/db/adapter/driver/pdo/statement.php:245
/apath/PHP/vendor/zendframework/zendframework/library/zend/db/adapter/driver/pdo/statement.php:240
/apath/PHP/module/Application/src/application/model/balloonmodel.php:243
/apath/PHP/tests/Model/BalloonModelTest.php:70

Caused by
PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'id' in 'field list' 

/apath/PHP/vendor/zendframework/zendframework/library/zend/db/adapter/driver/pdo/statement.php:240
/apath/PHP/module/Application/src/application/model/balloonmodel.php:243
/apath/PHP/tests/Model/BalloonModelTest.php:70

这告诉我'getAdapter','query'和'execute'调用仍在进行中,即使它们理论上都被模拟了。我尽可能地验证了所使用的类名是使用正确的命名空间。有什么想法吗?

0 个答案:

没有答案