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 オブジェクト) を再作成して保存しようとしましたが、同じ結果になりました。接続にリセットが必要な状態 (?) があるようです。
私が見つけた唯一の方法は、トランザクションをロールバックして新しいトランザクションを開始することです。