在Zend Framework中使用DbUnit扩展缺少数据库测试中的抽象方法错误

时间:2012-05-01 09:58:55

标签: zend-framework phpunit dbunit

在使用phpUnit

在Zend Framework中运行一些基本数据库测试后出现以下错误
PHP Fatal error:  Class Zend_Test_PHPUnit_Db_Metadata_Generic contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (PHPUnit_Extensions_Database_DB_IMetaData::disablePrimaryKeys, PHPUnit_Extensions_Database_DB_IMetaData::enablePrimaryKeys) in D:\www\~library\zend_latest\library\Zend\Test\PHPUnit\Db\Metadata\Generic.php on line 167

我的测试与ZF文档中的测试非常相似:

class BugsTest extends Zend_Test_PHPUnit_DatabaseTestCase
{
private $_connectionMock;

/**
 * Returns the test database connection.
 *
 * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
 */
protected function getConnection()
{
    if($this->_connectionMock == null) {
        $connection = Zend_Db::factory(...);
        $this->_connectionMock = $this->createZendDbConnection(
            $connection, 'zfunittests'
        );
        Zend_Db_Table_Abstract::setDefaultAdapter($connection);
    }
    return $this->_connectionMock;
}

/**
 * @return PHPUnit_Extensions_Database_DataSet_IDataSet
 */
protected function getDataSet()
{
    return $this->createFlatXmlDataSet(
        dirname(__FILE__) . '/_files/bugsSeed.xml'
    );
}
}

我对该问题的“修复”是不要在PHPUnit_Extensions_Database_DB_IMetaData库中阻止Zend_Test_PHPUnit_Db_Metadata_Generic。现在一切正常,但我想知道是否有任何正确的方法来解决这个问题。

我正在使用ZF 11.11,phpUnit 3.6.10和DbUnit 1.1.2。

2 个答案:

答案 0 :(得分:2)

Zend 1.11不支持PHPUnit 3.6,你需要降级做PHPUnit 3.5或3.4。

尝试以特定顺序卸载并重新安装PHPUnit及其依赖项,如http://dustyreagan.com/downgrade-phpunit-3-6-to-3-5-15/

所示

另请参阅http://framework.zend.com/issues/browse/ZF-11781

答案 1 :(得分:2)

在不卸载最新版本(http://framework.zend.com/issues/browse/ZF-11828中提到)的情况下,将PHPUnit降级到3.4或3.5的替代方法更为简单。

另一种方法是运行多个版本的PHPUnit。例如,要将PHPUnit / 3.5安装到/opt目录中:

sudo pear config-set auto_discover 1
sudo pear install --installroot /opt/phpunit35 pear.phpunit.de/PHPUnit-3.5.15
sudo ln -s /opt/phpunit35/usr/bin/phpunit /usr/local/bin/phpunit35

安装完成后,手动编辑/opt/phpunit35/usr/bin/phpunit以正确设置包含路径。将以下内容添加到文件顶部:

// Ubuntu / Debian
set_include_path(implode(PATH_SEPARATOR, array(
    dirname(__FILE__) . '/../share/php',
    get_include_path()
)));

// CentOS
set_include_path(implode(PATH_SEPARATOR, array(
    dirname(__FILE__) . '/../share/pear',
    get_include_path()
)));

现在可以通过执行phpunit35从命令行获得PHPUnit / 3.5。

请注意,ZF / 1.11的官方支持版本是PHPUnit / 3.4;但是,我更喜欢使用3.5,因为它有一些似乎不会破坏兼容性的额外功能。

最后,在运行测试套件时,更新任何构建脚本(例如Jenkins,Makefile或IDE项目)以指向phpunit35而不是phpunit

另请参阅:http://tech.vg.no/2011/11/29/running-multiple-versions-of-phpunit/