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 に答える