Unit testing 将zend test dbadapter与zend db表摘要一起使用
有人能够将Zend_Test_DbAdapter与Zend_Db_Table_Abstract一起使用吗 我正在尝试测试我创建的扩展Zend_Db_Table_Abstract的模型,如果我使用Zend_test_DbAdapter(其他适配器,如mysql或sqlite),我会遇到一个关于主键未设置的异常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
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)仍然返回一个关联数组,而不是数字数组。