Djangoユニットテストから使用したい大規模な読み取り専用のWordnetPostgreSQLデータベースがあります。具体的には、このWordnetデータベースをラップする「wordnet」というアプリがあります。残念ながら、デフォルトのDjangoユニットテストフレームワークは、すべてのアプリに空のインメモリSQLiteデータベースを使用します。
単体テスト内で、ワードネットアプリのみにPostgreSQLデータベースを使用し、他のアプリには使用しないにはどうすればよいですか?
私はDjangoデータベースルーターに精通しており、それらが解決策になるかもしれないと思います。そこで、routers.pyに次のように作成しました。
NEEDS_REAL_DB_APPS = (
'wordnet',
'auth',
'contenttypes',
)
REAL_DB = 'default'
class UseRealDBRouter(object):
def db_for_read(self, model, **hints):
if model._meta.app_label in NEEDS_REAL_DB_APPS:
return REAL_DB
return None
def db_for_write(self, model, **hints):
if model._meta.app_label in NEEDS_REAL_DB_APPS:
return REAL_DB
return None
def allow_relation(self, obj1, obj2, **hints):
if obj1._meta.app_label in NEEDS_REAL_DB_APPS and obj2._meta.app_label in NEEDS_REAL_DB_APPS:
return True
return None
def allow_syncdb(self, db, model):
if db == REAL_DB:
return model._meta.app_label in NEEDS_REAL_DB_APPS
elif model._meta.app_label in NEEDS_REAL_DB_APPS:
return False
return None
そして私のtests.pyは次のようになります:
from django.test import TestCase
from wordnet import models as wn_models
class Tests(TestCase):
def test_wordnet(self):
q = wn_models.Word.objects.all()
self.assertEqual(q.count(), 86547)
ただし、ユニットテスト(例manage.py test myapp.Tests.test_wordnet
)を実行すると、チェックは失敗し、すべての単語のカウントに対して0が返され、「実際の」データベースをまだ使用していないことを示します。私は何が間違っているのですか?