Unit testing 将zend test dbadapter与zend db表摘要一起使用

Unit testing 将zend test dbadapter与zend db表摘要一起使用,unit-testing,zend-framework,zend-db,zend-db-table,zend-test,Unit Testing,Zend Framework,Zend Db,Zend Db Table,Zend Test,有人能够将Zend_Test_DbAdapter与Zend_Db_Table_Abstract一起使用吗 我正在尝试测试我创建的扩展Zend_Db_Table_Abstract的模型,如果我使用Zend_test_DbAdapter(其他适配器,如mysql或sqlite),我会遇到一个关于主键未设置的异常 PHPUnit测试类的代码段: protected function setUp() { $adapter = new Zend_Test_DbAdapter(); $s

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

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



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
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

强制主键也不起作用:

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: 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
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

获取异常的原因是:表必须有主键,但找不到主键,因为所有使用
Zend\u Db\u Table
的表都必须定义主键。在使用该表时,由于在
DbTable
类中未定义主键,Zend_Db试图通过检查信息架构中的表属性来确定该表的主键。它发现您的表没有主键,因此失败

从:

如果不指定主键,
Zend\u Db\u Table\u Abstract
将尝试 根据提供的信息查找主键
可描述()方法

注意:每个表类都必须知道哪些列可以用来寻址 行是唯一的。如果表中未指定主键列 类定义或表构造函数参数,或在 由**
descripbetable()
提供的表元数据,则该表无法 与Zend\u Db\u表一起使用

试图强制主键不起作用,因为您的表似乎没有指定为主键的名为
id
的列

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


在扩展
Zend\u Db\u Table\u Abstract
的模型类中,可以使用
protected$\u primary='primary\u column'指定一个非ID的主键

您可以通过在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
    )
));

然后将表名称、列名称和模式名称与实现中的值进行转换。您需要对测试类中与之交互的每个表执行此操作

你能为你的模型发布代码吗?异常的堆栈跟踪是什么?我已经在我的原始帖子中添加了代码和strack跟踪。我希望这能有所帮助。我应该指出跟踪中列出的Category.php和CategoryTest.php的行号是错误的,因为我已经压缩了这篇文章的源代码。在这两种情况下,跟踪都是指Category.php中的“$rows=$this->fetchAll()”和“$actual=$this->fixture->getMap();”在CategoryTest.php中。感谢您的回复!问题是我正在尝试使用Zend_Test_DbAdapter进行测试。该适配器没有连接到真正的数据库,因此没有表元数据的概念(据我所知)。这是真的,但它是从
Zend\u Db\u table\u Abstract
扩展而来的,它在构建过程中很早就执行此检查,这就是为什么会出现错误。在进行It测试时,您仍然需要设置主键,无论如何,您都必须在生产中进行设置。添加主键的定义应该不会出现错误。正如我之前所说,Zend_Test_DbaAdapter没有元数据的概念,因此不能将任何列设置为主键。最后我想你回答了我的问题-因为Zend_Db_Table_Abstract需要主键,所以Zend_Test_DbAdapter不能使用。这真是太遗憾了……好像你添加了一个虚拟的
protected$\u primary='id'对于您的类别模型,错误应该消失。这解决了部分问题,但暴露了一个新的相关问题。调用Zend_Db_Adapter_Abstract的fetchPairs()方法时,$row[0]和$row[1]不存在。这是因为$stmt->fetch(Zend_Db::fetch_NUM)仍然返回一个关联数组,而不是数字数组。