2017-03-03 12 views
5

on_commit機能がDjango 1.9に追加され、現在のトランザクションがコミットされた後にアクション(例えば、Celeryタスク)をトリガできるようになりました。データベースをクリアせずにDjangoのon_commitフックをテストするには?

これらは後でin the docsに記載されています。その機能に依存する機能をテストするには、TransactionTestCaseを使用する必要があります。しかし、TestCase(トランザクションを使用してロールバック)とは異なり、TransactionTestCaseは各テスト後にデータベース全体を空にします。

残念ながら、データベース内にいくつかの有用なデータをプリロードするデータ移行があります。つまり、最初のテストでデータベースがクリアされた後、後続のテストがもう機能しなくなります。

私はon_commitをあざけることにより、汚れたトリックに頼ることになった:

with mock.patch.object(django.db.transaction, 'on_commit', lambda t: t()): 
    test_something() 

は、より良い方法はありますか?

+3

実際にあなたの回避策はそれほど悪くないです。そして、私は私のユースケース(大規模な 'setUp'やたくさんの什器)が遅いため、' TransactionTestCase'を使いたくないです。 – Palasaty

答えて

0

私は心の中で二つの可能性があります。

  1. thisとしてセクションでは、post_migrateがフラッシュした後放出されたと言う、あなたはあなたがTransactionTestCaseのサブクラスを作成し、あなたの_fixture_teardownを実装することができますいくつかの有用なデータ
  2. をプリロード実行できるように(あなたがそれを見ることができますメソッドの最後にflushが呼び出されます)。

マイグレーションが高すぎず、2番目のマイグレーションがある場合は、最初のものに固執します。

+0

'post_migrate'シグナルを使うのは良い考えです。私はデータの移行をこれに変換することができるかどうかを確認します。なぜなら、全体的にはるかにきれいに聞こえるからです! –

2

TestCaseをそのまま使用して、偽のコミットを実行してください。run_and_clear_commit_hooksで強制的に実行されます。 は、この記事をチェックしてください:

https://medium.com/gitux/speed-up-django-transaction-hooks-tests-6de4a558ef96

+0

これは興味深いハックですので、アップヴォートですが、内部Djangoメソッドを使用することには注意が必要です。 –

関連する問題