我有一个大型只读 Wordnet PostgreSQL 数据库,我想从 Django 单元测试中使用它。具体来说,我有一个名为“wordnet”的应用程序,它包装了这个 Wordnet 数据库。不幸的是,默认的 Django unittest 框架为所有应用程序使用一个空的内存 SQLite 数据库。
如何在单元测试中仅将我的 PostgreSQL 数据库用于 wordnet 应用程序,而不用于其他应用程序?
我熟悉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,表明它仍然没有使用“真实”数据库。我究竟做错了什么?