2

有没有人能够将 Zend_Test_DbAdapter 与 Zend_Db_Table_Abstract 一起使用?

我正在尝试测试我创建的扩展 Zend_Db_Table_Abstract 的模型,如果我使用 Zend_Test_DbAdapter(其他适配器,如 mysql 或 sqlite)工作正常,我会收到关于未设置主键的异常。


class Model_Category extends Zend_Db_Table_Abstract
{
    protected $_name = 'categories';

    protected $_dependentTables = array('Model_Video');

    public function getMap()
    {
        $map = array();
        $rows = $this->fetchAll();
        foreach($rows as $row)
        {
            $map[$row->id] = $row->name;
        }

        return $map;
    }
}

来自 PHPUnit 测试类的片段:

protected function setUp()
{
    $adapter = new Zend_Test_DbAdapter();
    $stmt = Zend_Test_DbStatement::createSelectStatement(array(
        array('id' => 1, 'name' => 'pranks'),
        array('id' => 2, 'name' => 'physical_feats'),
        array('id' => 3, 'name' => 'art'),
        array('id' => 4, 'name' => 'cute'),
        array('id' => 5, 'name' => 'philanthropy')
    ));
    $adapter->appendStatementToStack($stmt);

    $this->fixture = new Model_Category($adapter);
}

执行模型的方法时抛出异常:

public function testGetMap()
{
    $expected = array(
        '1' => 'pranks',
        '2' => 'physical_feats',
        '3' => 'art',
        '4' => 'cute',
        '5' => 'philanthropy'
    );
    $actual = $this->fixture->getMap();
    $this->assertEquals($expected, $actual);
}

结果是:

Model_CategoryTest::testGetMap()
Zend_Db_Table_Exception: A table must have a primary key, but none was found
ZendFramework-1.10.6/library/Zend/Db/Table/Abstract.php:876
ZendFramework-1.10.6/library/Zend/Db/Table/Abstract.php:969
ZendFramework-1.10.6/library/Zend/Db/Table/Select.php:100
ZendFramework-1.10.6/library/Zend/Db/Table/Select.php:78
ZendFramework-1.10.6/library/Zend/Db/Table/Abstract.php:1005
ZendFramework-1.10.6/library/Zend/Db/Table/Abstract.php:1303
application/models/Category.php:35
tests/unit/application/models/CategoryTest.php:90

强制主键也不起作用:

protected function setUp()
{
    $adapter = new Zend_Test_DbAdapter();
    $stmt = Zend_Test_DbStatement::createSelectStatement(array(
        array('id' => 1, 'name' => 'pranks'),
        array('id' => 2, 'name' => 'physical_feats'),
        array('id' => 3, 'name' => 'art'),
        array('id' => 4, 'name' => 'cute'),
        array('id' => 5, 'name' => 'philanthropy')
    ));
    $adapter->appendStatementToStack($stmt);

    $this->fixture = new Model_Category(array(
        'db' => $adapter,
        'primary' => 'id'
    ));
}

执行相同的单元测试,从上面结果:

Model_CategoryTest::testGetMap()
Zend_Db_Table_Exception: Primary key column(s) (id) are not columns in this table ()
ZendFramework-1.10.6/library/Zend/Db/Table/Abstract.php:888
ZendFramework-1.10.6/library/Zend/Db/Table/Abstract.php:969
ZendFramework-1.10.6/library/Zend/Db/Table/Select.php:100
ZendFramework-1.10.6/library/Zend/Db/Table/Select.php:78
ZendFramework-1.10.6/library/Zend/Db/Table/Abstract.php:1005
ZendFramework-1.10.6/library/Zend/Db/Table/Abstract.php:1303
application/models/Category.php:35
tests/unit/application/models/CategoryTest.php:93
4

2 回答 2

2

您可以通过在 Zend_Test_DbAdapter 实例上执行以下操作来定义主键:

$adapter = new Zend_Test_DbAdapter();
$adapter->setDescribeTable('table_name', array('column_name' =>
    array(
        'SCHEMA_NAME' => 'schema_name',
        'TABLE_NAME'  => 'table_name'
        'COLUMN_NAME' => 'column_name',     
        'PRIMARY'     => true
    )
));

然后将 table_name、column_name 和 schema_name 与您的实现中的值一起转换。您需要对您在被测类中与之交互的每个表执行此操作。

于 2012-11-05T17:43:34.380 回答
0

您收到异常的原因Zend_Db_Table_Exception: A table must have a primary key, but none was found是因为所有使用的表都Zend_Db_Table必须定义一个主键。当您使用该表时,由于您的DbTable类中没有定义主键,Zend_Db 尝试通过检查信息模式中的表属性来确定表的主键。它看到您的表没有主键并且失败。

手册

如果不指定主键,Zend_Db_Table_Abstract则尝试根据 describeTable()方法提供的信息发现主键。

注意:每个表类都必须知道哪些列可用于唯一地寻址行。如果在表类定义或表构造函数参数中未指定主键列,或者在 ** 提供的表元数据中未发现主键列describeTable(),则该表不能与 一起使用Zend_Db_Table

尝试强制主键不起作用,因为看起来您的表没有id您指定为主键的名为的列。

解决方案是向您尝试使用的表添加主键。

在扩展的模型类中,Zend_Db_Table_Abstract您可以指定一个不是 ID 的主键protected $_primary = 'primary_column';

于 2012-10-17T17:23:24.270 回答