Конечно, попробуйте это для размера:
from django.conf import settings
from django.core.management import call_command
from django.test.testcases import TestCase
from django.db.models import loading
class AppTestCase(TestCase):
'''
Adds apps specified in `self.apps` to `INSTALLED_APPS` and
performs a `syncdb` at runtime.
'''
apps = ()
_source_installed_apps = ()
def _pre_setup(self):
super(AppTestCase, self)._pre_setup()
if self.apps:
self._source_installed_apps = settings.INSTALLED_APPS
settings.INSTALLED_APPS = settings.INSTALLED_APPS + self.apps
loading.cache.loaded = False
call_command('syncdb', verbosity=0)
def _post_teardown(self):
super(AppTestCase, self)._post_teardown()
if self._source_installed_apps:
settings.INSTALLED_APPS = self._source_installed_apps
self._source_installed_apps = ()
loading.cache.loaded = False
Ваш тестовый пример будет выглядеть примерно так:
class SomeAppTestCase(AppTestCase):
apps = ('someapp',)
Если вам интересно, почему, я сделал переопределение_pre_setup()
и _post_teardown()
, поэтому мне не нужно беспокоиться о вызовах super()
в setUp()
и tearDown()
в моем последнем тестовом примере.В противном случае, это то, что я вытащил из теста Джанго.Я поднял его, и он сработал, хотя я уверен, что при более тщательном рассмотрении вы сможете еще больше оптимизировать его и даже избегать вызова syncdb
каждый раз, если это не будет конфликтовать с будущими тестами.
РЕДАКТИРОВАТЬ:
Так что я, кажется, ушел с моего пути, думая, что вам нужно динамически добавлять новые модели.Если вы создали приложение только для целей тестирования, вот что вы можете сделать, чтобы оно было обнаружено во время ваших тестов.
В каталоге вашего проекта создайте файл test.py
, который будет содержать ваши настройки теста.Это должно выглядеть примерно так:
from settings import *
# registers test app for discovery
INSTALLED_APPS += ('path.to.test.app',)
Теперь вы можете запускать свои тесты с помощью python manage.py test --settings=myproject.test
, и ваше приложение будет в установленных приложениях.