2009-08-20 14 views
7

誰かがPostgres DBのエラー、特にIntegrityErrorを正しくテストする方法を教えてください。例えば、私は次のテストを持っている:django Postgres IntegrityError

class TestSlugs(TestCase): 
    # This slug must be unique 
    b = BookPublisher(slug=self.duplicate_slug) 
    self.assertRaises(IntegrityError, b.save) 

    #check if there's only one BookPublisher 
    self.assertEquals(BookPublisher.objects.count(), 1) 

それが作品、[OK]をpostgresにどのようなので、ここでは、IntegrityErrorをキャッチが、その後、すべての操作は失敗します。私はドキュメントで私はtransaction.rollback()を使用することができます参照してください:どこで:テストまたはsave()メソッドで?

また、私は手でロールバックを書くのが好きではありません。どうしてジャンゴは保存しようとしないのですか?それが失敗すると、IntegrityErrorを与えて仕事を続けましょう。

私はジャンゴ1.1

答えて

2

は、save()メソッドを変更しないでください通常の操作のもとで伝播します。 Testクラスで例外をキャッチしてロールバックする必要があります(トランザクションをテストするので、通常のTestCaseの代わりにTransactionalTestCaseをサブクラス化する必要があることに注意してください)。

+0

ありがとうございます。したがって、ライブコードでは、IntegrityErrorを捕まえた後はすべて正常になりますか?それとも明示的にロールバックする必要がありますか? –

+0

あなた自身のコードでIntegrityErrorを引き起こすことは避け、SQLエラーをバグとして扱います。したがって、変更を行う前に確認してください。変更ができない場合は、ロールバックして問題をユーザーに報告できます。または、変更をスキップするか、代わりに別の変更を加えることもできます。 –

2

を使用していない、これが有効であることは100%を確認してください、しかし、あなたが行うことができます:あなたはそれがしたいので、

def save(self): 
    transaction.commit() 
    try: 
     super(MyModel, self).save() 
    except IntegrityError: 
     transaction.rollback() 
    else: 
     transaction.commit() 
+0

ありがとう、私はそれを試してみましょう。しかし、率直に言って、これは醜いです:) –

関連する問題