在使用symfony中的Propel进行单元测试时,如何在预期的异常后重置连接

时间:2012-05-26 13:54:04

标签: symfony1 symfony-1.4 propel

使用Propel for my ORM在symfony 1.4中工作(不知道如何找到Propel的版本)。

在对数据库中具有唯一约束的对象的单元测试中,我测试了被捕获的异常:

try {
  $room1a->save();
  // Shouldn't have saved, so shouldn't have an id
  $t->ok(!$room1a->getId(), "Failed to save duplicate room");
} catch (Exception $e) {
  $t->ok($e, "Threw exception on creating duplicate room");
}

但如果我然后更正重复并再试一次,那么

$room1a->setCode('1a');
$room1a->save();
$t->ok($room1a->getId()), "Saved this time");

我得到"无法获得序列ID":

     PropelException: Unable to get sequence id. [wrapped:                
  SQLSTATE[25P02]: In failed sql transaction: 7 ERROR:  current        
  transaction is aborted, commands ignored until end of transaction    
  block]                                                               
  (in                                                                  
  lib/vendor/symfony/lib/plugins/sfPropelPlugin/lib/vendor/propel/util/BasePeer.php
  on line 264)  

我尝试重新创建对象(即一个新的Room对象)并保存它,结果相同;似乎连接(?)中存在需要重置的状态。

我发现的唯一方法是回滚交易并开始新交易。

1 个答案:

答案 0 :(得分:0)

我找到了答案:这就是transactions的工作方式。

我将单元测试脚本包装在一个事务中,以便不更改数据库,我没有意识到引发约束错误会中止事务。

对我来说有点烦人,因为我必须重新启动新事务并重新设置数据,以便进行后续测试。