【问题标题】:PHPUnit + Doctrine + Versionable + ZF bugPHPUnit + Doctrine + Versionable + ZF bug
【发布时间】:2011-07-03 10:11:07
【问题描述】:

大家好

我已经为“地址”表设置了版本控制行为,但是当我尝试运行 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

它断开了连接,但我不知道为什么。如果我删除“版本化”行为 - 那么它会起作用!

你能帮帮我吗?我真的很喜欢它,不知道错误原因:(

感谢您的关注!

更新:

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

【问题讨论】:

    标签: zend-framework doctrine phpunit


    【解决方案1】:

    我在处理大量 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');
    }
    // }}}
    

    【讨论】:

    • 原因是 - “版本化”插件。 $account->Distributor->Address->getListener()->setOption('disabled', true);它解决了问题。
    猜你喜欢
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 2016-11-14
    • 2015-07-13
    • 2012-12-13
    • 1970-01-01
    相关资源
    最近更新 更多