PHPUnit + Doctrine + Versionable + ZF bug

时间:2011-02-24 09:20:39

标签: zend-framework doctrine phpunit

大家好

我为'Address'表设置了可版本化的行为,但是当我尝试运行PHPUnit测试时,我遇到了以下错误:

  

SQLSTATE [HY000]:常规错误:1205   超过锁定等待超时;尝试   重启交易

我的testCase上有2个'test *'方法。如果我只留下1然后它就有效,如果> 1 - 然后我得到了那个错误。

以下是代码:

类UserTest扩展了DbTestCase {

protected $object;

protected function setUp()
{ 
    // zf bootstrap here and doctrine connect
    parent::setUp();

    // clean/create tmp tables
    $this->_prepareDB();
    $this->object = new User;
}

public function testGetFullUsername()
{
    $model = new User;
    $model->email      = $email . time();
    ...

    $model->Supplier->Address->firstname = $first_name;
    $model->Supplier->Address->lastname  = $last_name;
    ...
    $model->UserRight[0]->role      = 'Supplier';
    $model->UserRight[0]->resource  = '*';
    $model->UserRight[0]->privilege = '';
    $model->save();
}
// it can be even the same
public function testRoles()
{
    $model = new User;
    $model->email      = $email . time();
    ...

    $model->Supplier->Address->firstname = $first_name;
    $model->Supplier->Address->lastname  = $last_name;
    ...
    $model->UserRight[0]->role      = 'Supplier';
    $model->UserRight[0]->resource  = '*';
    $model->UserRight[0]->privilege = '';
    $model->save();
}

}

当PHPunit运行第二个方法时,事务结束并启动另一个方法:

// 1st method
// thread id: 412
START TRANSACTION
INSERT INTO user (...) VALUES (...)
INSERT INTO address (...) VALUES ('...')
INSERT INTO address_version (...) VALUES (...)
INSERT INTO supplier (...) VALUES (...)
INSERT INTO user_right (...) VALUES (..)
commit

// 2nd method
// thread id: 413
START TRANSACTION
INSERT INTO user (...) VALUES (...)
INSERT INTO address (..) VALUES (...)
// then new thread created (server disconnects), id: 414

CONNECT xxxxx@localhost on xxxx__tmp_testing
START TRANSACTION
INSERT INTO address_version (...) VALUES (...)
rollback
rollback

它丢弃了连接,但我不知道为什么。如果我删除“Versionable”行为 - 那么它就可以了!

你能帮我吗?我真的堆叠它并且不知道错误原因:(

感谢您的关注!

更新

原因是“版本化”插件。我们必须在phpunit测试中禁用它:$ account-> Distributor-> Address-> getListener() - > setOption('disabled',true); 附加到“地址”模型的版本 它解决了这个问题。

1 个答案:

答案 0 :(得分:0)

我遇到了很多REPLACE / INSERT查询的问题。

我可以在phpunit中初始化持久连接来解决这个问题。

// {{{ getConnection()
/**
 * gets database connection
 */
protected function getConnection() {
    $pdo = new pdo("mysql:dbname=depage_phpunit;host=localhost", "root", "", array(
        \PDO::ATTR_PERSISTENT => true,
    ));

    return $this->createDefaultDBConnection($pdo, 'testdb');
}
// }}}