unit-testing - 使用 zend test dbadapter 和 zend db 表摘要

标签 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)工作正常,我会得到一个关于未设置主键的异常。


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

最佳答案

您可以通过在 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 与您的实现中的值进行调换。您需要对正在测试的类中与之交互的每个表执行此操作。

关于unit-testing - 使用 zend test dbadapter 和 zend db 表摘要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12886643/

相关文章:

php - Zend Framework 2-处理空值的列(float 类型)

php - Zend\Db\ResultSet\ResultSet 对象在哪里存储检索到的数据?

asp.net-mvc - 在 ASP.NET MVC 测试项目中模拟静态方法

objective-c - 如何使用 xCode 6 中的期望设置异步单元测试?

javascript - 对 Jest 测试文件进行 linting 测试时,eslint 抛出 `no-undef` 错误

ajax - Zend 表单 ajax 提交验证

regex - Zend Route Url 与正则表达式

zend-framework - 如何清除zend中两个表单页面上的一组错误

zend-framework - Zend Db Select 将子查询添加到 FROM 部分

c# - 如何在 Moq 中使用 lambda 语法设置现有模拟?