Как запретить юнит-тестам Django запускать южные миграции?
У меня есть пользовательское приложение Django, myapp, которое я пытаюсь протестировать с помощью manage.py test myapp
, но когда я запускаю его, я получаю сообщение об ошибке:
django.db.utils.OperationalError: table "myapp_mymodel" already exists
и, конечно же, трассировка показывает, что выполняется South:
File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/south/management/commands/test.py", line 8, in handle
super(Command, self).handle(*args, **kwargs)
Однако в моих настройках я указал:
SOUTH_TESTS_MIGRATE = 0
SKIP_SOUTH_TESTS = 1
который, я считаю, должен помешать тестовой среде Django выполнять какие-либо южные компоненты.
Что я делаю неправильно?
Изменить: я обошел это, просто удалив юг с помощью:
if 'test' in sys.argv:
INSTALLED_APPS.remove('south')
Однако затем я получил:
ImproperlyConfigured: settings.DATABASES is improperly configured. Please supply the NAME value.
Для моих тестовых настроек базы данных я использовал:
DATABASES = {
'default':{
'ENGINE': 'django.db.backends.sqlite3'
}
}
который отлично работал в Django 1.4. Теперь я использую Django 1.5, и я думаю, что это не кошерно. Однако я не вижу значения NAME, чтобы это исправить. Все они сообщают, что ни одна из моих таблиц не существует. Я пробовал:
DATABASES = {
'default':{
'ENGINE': 'django.db.backends.sqlite3',
'NAME': '/dev/shm/test.db',
'TEST_NAME': '/dev/shm/test.db',
}
}
DATABASES = {
'default':{
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ':memory:',
'TEST_NAME': ':memory:',
}
}
DATABASES = {
'default':{
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(os.path.dirname(__file__), 'test.db'),
'TEST_NAME': os.path.join(os.path.dirname(__file__), 'test.db'),
}
}
кажется, что каждый создает физический файл test.db, чего я не понимаю, потому что юнит-тесты должны запускаться в памяти. Он никогда не должен ничего сохранять на диск. Предположительно, он не может запустить syncdb после создания файла, но до того, как он выполнит фактический модульный тест. Как я могу это исправить?
Редактировать: я обнаружил, что в одной из моих форм я заполнял варианты полей, напрямую запрашивая модель (тогда как я должен был делать это внутри формы init), поэтому, когда тестовая среда Django импортировала мой модели он пытался прочитать таблицу до того, как была создана база данных sqlite3. Я исправил это, но теперь я получаю сообщение об ошибке:
DatabaseError: table "myapp_mythroughmodel" already exists
так что я вернулся к исходной точке, хотя он выдает другой тип исключения, чем изначально.
Редактировать: у меня была определена дублирующая модель, из-за чего Django пытался создать ее дважды, что привело к ошибке.
SOUTH_TESTS_MIGRATE = False
иSKIP_SOUTH_TESTS = True
- person Steve Jalim   schedule 01.05.2014