2011-09-08 14 views
0

私はDjango-1.3をMySQL dbエンジンで使用しています。子スレッドにモデルデータがありません

単体テストの場合(manage.pyを使ってテストを実行する)、私はオブジェクトを作成して保存します。

レスポンスハンドラから(objects.filterを使用して)オブジェクトをクエリすると、うまくいきます。 Pythonスレッドモジュール(threading.Thread)を使用して子スレッドを作成し、同じobjects.filter呼び出しを試行すると、そのオブジェクトは表示されません。なぜ、子スレッドは、ユニットテストセットアップで作成したエントリが親スレッドで表示されているのを見ることができませんか?

+0

それはあなたが正しくやっているように聞こえる。データベースにはどこに問い合わせますか? Djangoは単体テスト用のデータベースを作成します。 –

答えて

1

通常のTestCaseの代わりにTransactionTestCaseを使用する必要があります。そうしないと、テストケース内でモデルに行った変更(例:セットアップ)は実際にDBにコミットされず、スレッドには見えません。詳細は、Django doc about TransactionTestCaseを参照してください。

また、私はスレッド内の接続を再作成する必要があることを発見しました。次のコードは、トリックでした:

from django.db import connection  
connection.close() 
cursor = connection.cursor() 

それはあなたのケースではありませんが、SQLiteのを使用する必要があり、また、あなたの設定でTEST_NAMEを指定する必要があります。もしそうでなければ、Django SQLite DBは完全にメモリ内にあり、スレッド間で共有することはできません。

このアプローチを使用すると、発生したDjangoテストケースからセレンとDBを制御しながら、ライブテストサーバーをスレッドに生成できます。私はサーバーのスレッドコードを取ったhere

関連する問題