Эмуляция приложения с моделями в django unittest - PullRequest
1 голос
/ 24 февраля 2011

У меня m writing some code which retrieves info about installed apps, especially defined models, and then does stuff based on that information, but I М есть некоторые проблемы при написании чистого, хорошего юнит-теста. Есть ли способ эмулировать или добавить приложение в юнит-тестах без необходимости запускать manage.py startproject, manage.py startapp в моей папке тестов, чтобы тестовое приложение было доступно для юнит-тестов?

1 Ответ

1 голос
/ 24 февраля 2011

Конечно, попробуйте это для размера:

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, и ваше приложение будет в установленных приложениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...