大家好,
我为'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); 附加到“地址”模型的版本 它解决了这个问题。
答案 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');
}
// }}}