-1

ORMにPropelを使用して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 オブジェクト) を再作成して保存しようとしましたが、同じ結果になりました。接続にリセットが必要な状態 (?) があるようです。

私が見つけた唯一の方法は、トランザクションをロールバックして新しいトランザクションを開始することです。

4

1 に答える 1

0

私は答えを見つけました。それがトランザクションの仕組みです。

データベースを変更しないように、単体テスト スクリプトをトランザクションにラップしていますが、制約エラーが発生するとトランザクションが中止されることに気付きませんでした。

後続のテストのために、新しいトランザクションを開始してデータを再度セットアップする必要があるため、少し面倒です。

于 2012-05-26T21:34:50.880 に答える