Тестирование Django: как получить базу данных ТОЛЬКО с данными приборов и без ошибок IntegrityError (путем диагностики источника ошибок)?

Я пытаюсь запустить тесты с данными приборов и получаю печально известную ошибку IntegrityError: column user_id is not unique.

Теперь, глядя на мои приборы, я вижу, что идентификаторы моих пользовательских моделей в моем приборе уникальны между собой. Я предполагаю, что конфликт связан с существующими данными в (не тестовой) базе данных. Это верно? (Правка: это кажется неверным — см. ниже)

Я хочу иметь возможность точно контролировать, какие данные доступны для моих тестов. Есть ли способ запретить тестовому запуску django загружать данные из моей реальной базы данных, а также данные моих приборов? (Изменить: Да — см. ответ Тибо).

Редактировать: переход на использование чистой базы данных в памяти согласно ответу Тибо не решает проблему. Соответственно, я делаю вывод, что моя существующая база данных разработчиков не является проблемой.

Итак, у меня есть третий вопрос: Как диагностировать причину ошибки IntegrityError при загрузке фикстур во время тестирования? (И как ее исправить?)

Редактировать 2: Решение моей проблемы, в дополнение к началу с чистой базы данных (согласно Тибо J), также заключалось в исключении моделей из установленных приложений, ссылающихся на пользователя, до тех пор, пока ошибка не исчезнет.

Другое предложение DrTyrsa (помимо просмотра данных) заключалось в использовании естественных ключей., что для Пользователя, несомненно, потребовало бы определенного количества исправлений или других хакерских действий (редактировать код для Пользователя?).


person Marcin    schedule 07.12.2011    source источник
comment
Это не проблема вашей модели User, это проблема какой-то другой модели, которая использует ForeignKey до User.   -  person DrTyrsa    schedule 07.12.2011
comment
@DrTyrsa: я подозреваю, что вы правы (см. мое обновление через мгновение). Не могли бы вы рассказать, как это диагностировать/исправить?   -  person Marcin    schedule 07.12.2011
comment
Трудно ответить, не видя ваших светильников и моделей. То, что определенно решит проблему, это естественные ключи . Но для его реализации потребуется некоторое время. Другой вариант — создать объекты с большим количеством отношений в методе setUp, но это не очень поможет, если у вас их много. Или вы можете просто внимательно изучить свои приборы и найти причину ошибки.   -  person DrTyrsa    schedule 07.12.2011
comment
@DrTyrsa: я был бы признателен за любые намеки на структурированный или интеллектуальный подход к тщательному изучению моих приборов.   -  person Marcin    schedule 07.12.2011
comment
А если разместить их здесь? И models.py.   -  person DrTyrsa    schedule 07.12.2011
comment
@DrTyrsa: Они довольно большие. Однако я обновляю свой вопрос, чтобы отразить ваши предложения.   -  person Marcin    schedule 07.12.2011
comment
Вы всегда можете удалить некоторые их части из конца файла. Когда нет исключений, вы только что удалили код, вызывающий проблему, нажмите Ctrl-Z и проверьте его.   -  person DrTyrsa    schedule 07.12.2011


Ответы (1)


Используйте другую базу данных для производства и тестов (хорошая практика). В 1_ :

if 'test' in sys.argv:                                                          
    try:                                                                        
        from test_settings import *                                             
    except ImportError:                                                         
        pass

In test_settings.py:

DATABASES = {                                                                   
    'default': {                                                                
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'memory://testdb',
    }                                                                           
}
person Thibault J    schedule 07.12.2011
comment
Спасибо - это работает (Creating test database for alias 'default' (':memory:')...), хотя и не решает мою проблему. (Ради педантизма я должен добавить, что ваш первый фрагмент, вероятно, должен быть помещен в конец settings.py). - person Marcin; 07.12.2011