2016-04-04 13 views
1

私は、Djangoの1.8(使用pytest)上だと私は、次の構成を有する:Djangoテストでデータベース設定をオーバーライドする方法は?

  • defaultとDBは、彼らは「かどうかに応じて、1つの接続、または他の呼び出し指示MasterSlaveRouterによって管理readonlyデータベース再読み取りまたは書き込み操作。
  • 私の開発環境では、settings.DATABASES辞書の両方のエントリが同じ設定を持っています(別の接続を使用しますが、データベースは同じです)。
  • 私のテスト環境では、defaultデータベースしかありません。
  • モデルFooが保存されるたびに私はpost_saveシグナルを発しました。
  • Fooインスタンスを変更し、.save()を2回呼び出すアトミック操作(@transaction.atomicで装飾)があります。 usingカスタムパラメータはデコレータに渡されないので、トランザクションはdefaultデータベースでのみ有効です。

post_saveコールバックはFooOneToOneFieldポインティングとBarレコードを作成しますが、これだけfoo_idBarレコードがすでに(IntegrityErrorを避けるために)存在するかどうかを確認した後。このチェックは、このクエリを実行することによって行われます。

already_exists = Bar.filter(foo=instance).exists() 

これはpost_saveコールバックが呼び出される初めてokです。 Barレコードが作成され、すべて正常に動作します。ただし、このようなBarインスタンスは、前のFooセーブで作成されたにもかかわらず、フィルタリングは読み取り操作であるため、接続を使用して実行されるため、Falseの値を含むalready_existsが終了し、 default接続で作成操作を実行すると、既にfoo_idのレコードが存在するため、新しいレコードがトリガされ、IntegrityErrorがスローされます。

私はDATABASES辞書をdev_settingsからtest_settingsにコピーしようとしましたが、これは多くのテストを壊しました。私はその後、override_settingsデコレータについて読んで、それが私の状況にとって完璧だと思った。しかし、私の驚いたことに、それはうまくいかなかった。ある時点で、アプリケーションが開始されるときに、DATABASES辞書(test_settingsのdefaultのみのもの)がキャッシュされ、setting.DATABASESを変更しても、新しい値は単にアクセスされないようです。

1つの特定のテストのデータベース構成を正しく上書きするにはどうすればよいですか?

答えて

0

Hum ...もしあなたがpytestだけを使っているのであれば、テスト後にデータベースをクリーンアップする必要があると思います。

さて、Djangoの設定を上書きする、それは良いことだ:あなたはpytest-ジャンゴを試してみてください

from django.test import override_settings 
@override_settings(DATABASE_CONFIG=<new_config>) 
def test_foo(): 
    pass 

pytestmark = pytest.mark.django_db 

@pytest.mark.django_db 
def test_foo(): 
    pass 

テストを実行すると、作成した-DBを設定することができますparam、強制的にpy。テストでは、新しいデータベースを作成するか、あなたのデシベルを再利用したい場合は、同様に、再利用-DBを設定することができます。

$ py.test --create-db 
$ py.test --reuse-db 

チェックアウト: Oficial docs

関連する問題