4

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が返され、「実際の」データベースをまだ使用していないことを示します。私は何が間違っているのですか?

4

1 に答える 1

2

テストに実際のデータベースを使用しないでください。

最初に本番データベースをダンプするのはどうですか:ここを見てください

そしてそれをテストフィクスチャにロードします:これをチェックしてください

于 2012-06-13T15:54:38.990 に答える