これを行うために私が使用しているパターンは次のとおりです。
サブクラス化されたバージョンの TestCase で使用するこのメソッドを作成しました。次のようになります。
@classmethod
def create_models_from_app(cls, app_name):
"""
Manually create Models (used only for testing) from the specified string app name.
Models are loaded from the module "<app_name>.models"
"""
from django.db import connection, DatabaseError
from django.db.models.loading import load_app
app = load_app(app_name)
from django.core.management import sql
from django.core.management.color import no_style
sql = sql.sql_create(app, no_style(), connection)
cursor = connection.cursor()
for statement in sql:
try:
cursor.execute(statement)
except DatabaseError, excn:
logger.debug(excn.message)
pass
myapp/tests/models.py
次に、 INSTALLED_APPS に含まれていないような特別なテスト固有の models.py ファイルを作成します。
私の setUp メソッドで create_models_from_app('myapp.tests') を呼び出すと、適切なテーブルが作成されます。
このアプローチの唯一の「落とし穴」は、実行するたびにモデルを作成したくないということですsetUp
。これが、DatabaseError をキャッチする理由です。このメソッドの呼び出しをテスト ファイルの先頭に置くと、少しはうまくいくと思います。