Джанго: испытание путаницы - PullRequest
3 голосов
/ 19 августа 2010

В модульных тестах, которые я написал, я предоставляю тестовое устройство для каждого TestCase. Тем не менее, я продолжаю получать дубликат (IntegrityError), когда он запускается в наборе тестов.

Итак, мне интересно, разве база данных не должна создаваться и заполняться в начале каждого TestCase и после того, как каждый тест был выполнен в этом TestCase, чтобы я мог предоставить разные фиксаторы для каждого TestCase?


Редактировать: добавлен тестовый код

class DashboardTestCase(TestCase):
    fixtures = ['initial.json']

    def setUp(self):
        u = User(username='su')
        u.save()
        self.name = "Test Dashboard"
        self.slug = "test-dashboard"
        self.description = "Test Description"
        self.fiscal_year = "2011"
        self.region = "Test Region"
        self.review_date = "2010-08-01"
        self.date_completed = "2009-03-15"
        self.prepared_by = "Test User"
        self.dashboard = Dashboard(name=self.name, description=self.description, fiscal_year=self.fiscal_year,
                                    region=self.region, review_date=self.review_date, date_completed=self.date_completed,
                                    prepared_by=self.prepared_by)
        self.dashboard.save()

    def testDashboardName(self):
        self.assertEqual(self.dashboard.name, self.name)
    def testDashboardDescription(self):
        self.assertEqual(self.dashboard.description, self.description)
    def testDashboardFiscalYear(self):
        self.assertEqual(self.dashboard.fiscal_year, self.fiscal_year)
    def testDashboardRegion(self):
        self.assertEqual(self.dashboard.region, self.region)
    def testDashboardReviewDate(self):
        self.assertEqual(self.dashboard.review_date, self.review_date)
    def testDashboardDateCompleted(self):
        self.assertEqual(self.dashboard.date_completed, self.date_completed)
    def testDashboardPreparedBy(self):
        self.assertEqual(self.dashboard.prepared_by, self.prepared_by)
    def testDashboardSlug(self):
        self.assertEqual(self.dashboard.slug, self.slug)
    def testDashboardSlugClash(self):
        # Create another dashboard with exactly the same name.
        self.dashboard2 = Dashboard(name='Test Dashboard')
        self.dashboard2.save()
        self.assertEqual(self.dashboard2.slug, 'test-dashboard1')

И трассировка:

Installing json fixture 'initial_data' from '/Users/Eric/Documents/DjangoProjects/MMR/../MMR/dashboard/fixtures'.
Problem installing fixture '/Users/Eric/Documents/DjangoProjects/MMR/../MMR/dashboard/fixtures/initial_data.json': Traceback (most recent call last):
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/core/management/commands/loaddata.py", line 169, in handle
    obj.save(using=using)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/core/serializers/base.py", line 165, in save
    models.Model.save_base(self.object, using=using, raw=True)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/db/models/base.py", line 501, in save_base
    rows = manager.using(using).filter(pk=pk_val)._update(values)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/db/models/query.py", line 491, in _update
    return query.get_compiler(self.db).execute_sql(None)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/db/models/sql/compiler.py", line 861, in execute_sql
    cursor = super(SQLUpdateCompiler, self).execute_sql(result_type)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/db/models/sql/compiler.py", line 727, in execute_sql
    cursor.execute(sql, params)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/db/backends/mysql/base.py", line 86, in execute
    return self.cursor.execute(query, args)
  File "build/bdist.macosx-10.5-i386/egg/MySQLdb/cursors.py", line 174, in execute
    self.errorhandler(self, exc, value)
  File "build/bdist.macosx-10.5-i386/egg/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
IntegrityError: (1062, "Duplicate entry 'dashboard-action' for key 'app_label'")

1 Ответ

2 голосов
/ 19 августа 2010

Итак, мне интересно, разве база данных не должна создаваться и заполняться в начале каждого TestCase

База данных создается только один раз - в начале пробного запуска. То есть когда вы выполняете ./manage.py test. Испытательные приспособления загружаются и удаляются соответственно до и после выполнения каждого метода испытаний . Это означает, что все ваши приборы загружаются в базу данных перед выполнением каждого метода тестирования. База данных удаляется после выполнения всех тестов .

Я получаю дубликат (IntegrityError), когда он запускается в наборе тестов

Не видя код, первое место, которое я бы проверил, было бы initial_data, если он существует. Initial_data загружается в базу данных в конце syncdb, и это происходит перед началом тестирования. Убедитесь, что ваш initial_data не загружает конфликтующие данные.

Вторым местом для поиска будут другие приборы, особенно если вы используете более одного файла приборов для каждого тестового класса.

Обновление

Problem installing fixture '/Users/Eric/Documents/DjangoProjects/MMR/../MMR/dashboard/fixtures/initial_data.json':

Кажется, что ошибка возникает даже до того, как загрузчик прибора (initial.json). Скорее всего внутри initial_data.json есть что-то, что дублируется и тем самым нарушает целостность базы данных.

Вот как бы я решил проблему:

"Duplicate entry 'dashboard-action' for key 'app_label'"
  1. Укажите, какая модель / таблица имеет ограничение, соответствующее app_label
  2. Просмотрите initial_data.json и выясните, существуют ли две строки с одинаковым значением для app_label.
  3. Удалите одну из них и попробуйте снова.

В дополнение к этому я бы предложил переименовать тестовый прибор в другое. Легко запутаться между initial.json и initial_data.json. Если, конечно, вы не хотели использовать initial_data.json. В этом случае строка fixtures = ... является избыточной и может быть удалена, так как initial_data.json будет загружен в любом случае.

Обновление 2

После самодовольного совета и похлопывания по спине, я наткнулся на эту ошибку Джанго . Я копаю больше грязи на нем. Обновлю снова после того, как найду больше.

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