django.db.utils.IntegrityError: Сбой ограничения FOREIGN KEY при выполнении LiveServerTestCases через Selenium и Python Django - PullRequest
0 голосов
/ 12 января 2019

Я могу успешно запустить все модульные тесты, я даже могу успешно запустить тесты на селен, если я запускаю независимый сервер, но когда я пытаюсь использовать LiveServerTestCases для самостоятельного тестирования всего, каждый тест LiveServerTestCase заканчивается следующей ошибкой после завершения функции tearDown:

  File "C:\Users\Win7\.virtualenvs\lang-QbOXb8q_\lib\site-packages\django\db\backends\base\base.py", line 239, in _commit
    return self.connection.commit()
django.db.utils.IntegrityError: FOREIGN KEY constraint failed

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\Win7\.virtualenvs\lang-QbOXb8q_\lib\site-packages\django\test\testcases.py", line 209, in __call__
    self._post_teardown()
  File "C:\Users\Win7\.virtualenvs\lang-QbOXb8q_\lib\site-packages\django\test\testcases.py", line 908, in _post_teardown
    self._fixture_teardown()
  File "C:\Users\Win7\.virtualenvs\lang-QbOXb8q_\lib\site-packages\django\test\testcases.py", line 943, in _fixture_teardown
    inhibit_post_migrate=inhibit_post_migrate)
  File "C:\Users\Win7\.virtualenvs\lang-QbOXb8q_\lib\site-packages\django\core\management\__init__.py", line 148, in call_command
    return command.execute(*args, **defaults)
  File "C:\Users\Win7\.virtualenvs\lang-QbOXb8q_\lib\site-packages\django\core\management\base.py", line 353, in execute
    output = self.handle(*args, **options)
  File "C:\Users\Win7\.virtualenvs\lang-QbOXb8q_\lib\site-packages\django\core\management\commands\flush.py", line 80, in handle
    emit_post_migrate_signal(verbosity, interactive, database)
  File "C:\Users\Win7\.virtualenvs\lang-QbOXb8q_\lib\site-packages\django\core\management\sql.py", line 51, in emit_post_migrate_signal
    **kwargs
  File "C:\Users\Win7\.virtualenvs\lang-QbOXb8q_\lib\site-packages\django\dispatch\dispatcher.py", line 175, in send
    for receiver in self._live_receivers(sender)
  File "C:\Users\Win7\.virtualenvs\lang-QbOXb8q_\lib\site-packages\django\dispatch\dispatcher.py", line 175, in <listcomp>
    for receiver in self._live_receivers(sender)
  File "C:\Users\Win7\.virtualenvs\lang-QbOXb8q_\lib\site-packages\django\contrib\auth\management\__init__.py", line 79, in create_permissions
    Permission.objects.using(using).bulk_create(perms)
  File "C:\Users\Win7\.virtualenvs\lang-QbOXb8q_\lib\site-packages\django\db\models\query.py", line 471, in bulk_create
    obj_without_pk._state.db = self.db
  File "C:\Users\Win7\.virtualenvs\lang-QbOXb8q_\lib\site-packages\django\db\transaction.py", line 212, in __exit__
    connection.commit()
  File "C:\Users\Win7\.virtualenvs\lang-QbOXb8q_\lib\site-packages\django\db\backends\base\base.py", line 261, in commit
    self._commit()
  File "C:\Users\Win7\.virtualenvs\lang-QbOXb8q_\lib\site-packages\django\db\backends\base\base.py", line 239, in _commit
    return self.connection.commit()
  File "C:\Users\Win7\.virtualenvs\lang-QbOXb8q_\lib\site-packages\django\db\utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "C:\Users\Win7\.virtualenvs\lang-QbOXb8q_\lib\site-packages\django\db\backends\base\base.py", line 239, in _commit
    return self.connection.commit()
django.db.utils.IntegrityError: FOREIGN KEY constraint failed

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

Я пытался использовать веб-драйвер Chrome, веб-драйвер IE и веб-драйвер Firefox. Те же результаты. Похоже, это не связано с моей базой данных, поскольку ошибка возникает только для LiveServerTestCases.

Сведения об окружающей среде

  • Django версия 2.1
  • SQLite3 версия 3.20.0

1 Ответ

0 голосов
/ 21 января 2019

Дополнительная информация о Django версии , База данных тип и версия вместе с вашим испытания кода помогли бы нам решить эту проблему лучше.

Однако это сообщение об ошибке ...

File "C:\Users\Win7\.virtualenvs\lang-QbOXb8q_\lib\site-packages\django\core\management\sql.py", line 51, in emit_post_migrate_signal **kwargs
.
File "C:\Users\Win7\.virtualenvs\lang-QbOXb8q_\lib\site-packages\django\db\backends\base\base.py", line 239, in _commit
    return self.connection.commit()
django.db.utils.IntegrityError: FOREIGN KEY constraint failed

... подразумевает, что IntegrityError был вызван при попытке сохранить экземпляр существующей модели.

Согласно Примечания к выпуску Django 2.0 :

  • Ограничения внешнего ключа теперь включены на SQLite : Это было несовместимое с обратным изменением ( IntegrityError: сбой ограничения FOREIGN KEY ) при попытке сохранить существующий экземпляр модели, который нарушает ограничение внешнего ключа.
  • Внешние ключи теперь создаются с DEFERRABLE INITIALLY DEFERRED вместо DEFERRABLE IMMEDIATE . Поэтому может потребоваться перестройка таблиц для воссоздания внешних ключей с новым определением, особенно если вы используете шаблон следующим образом:

    from django.db import transaction
    
    with transaction.atomic():
        Book.objects.create(author_id=1)
        Author.objects.create(id=1)
    
  • Если вы не воссоздаете внешний ключ как DEFERRED , первый create() завершится ошибкой, поскольку ограничения внешнего ключа применяются.

  • @ dirkgroten в этом обсуждении предоставил следующий пример:

    • Поищите шаблоны, подобные этой, в вашем коде:

       # in pagetree/models.py, line 810
       @classmethod
       def create_from_dict(cls, d):
          return cls.objects.create()  # what happens to d by the way?
      
    • Это определенно завершится с ошибкой ForeignKey constraint , поскольку PageBlock должен иметь раздел, поэтому вы не можете вызвать create, не назначив его предварительно.

...