Django LiveServerTestCase - невозможно выполнить force_login в нескольких тестах - PullRequest
0 голосов
/ 04 марта 2020

Версии

  • Django версия: 1,9
  • Python: 3,5
  • Django Rest Framework: 3.5.4

Наблюдаемая ошибка:

Error
Traceback (most recent call last):
  File "/Users/ds/git/some_repo/integration/test_multiple_login.py", line 32, in test_two
    self.client.force_login(self.user)
  File "/Users/ds/.pyenv/versions/3.5.7/envs/work_env/lib/python3.5/site-packages/django/test/client.py", line 608, in force_login
    self._login(user)
  File "/Users/ds/.pyenv/versions/3.5.7/envs/work_env/lib/python3.5/site-packages/django/test/client.py", line 621, in _login
    login(request, user)
  File "/Users/ds/.pyenv/versions/3.5.7/envs/work_env/lib/python3.5/site-packages/django/contrib/auth/__init__.py", line 117, in login
    user_logged_in.send(sender=user.__class__, request=request, user=user)
  File "/Users/ds/.pyenv/versions/3.5.7/envs/work_env/lib/python3.5/site-packages/django/dispatch/dispatcher.py", line 192, in send
    response = receiver(signal=self, sender=sender, **named)
  File "/Users/ds/.pyenv/versions/3.5.7/envs/work_env/lib/python3.5/site-packages/django/contrib/auth/models.py", line 23, in update_last_login
    user.save(update_fields=['last_login'])
  File "/Users/ds/.pyenv/versions/3.5.7/envs/work_env/lib/python3.5/site-packages/django/contrib/auth/base_user.py", line 74, in save
    super(AbstractBaseUser, self).save(*args, **kwargs)
  File "/Users/ds/.pyenv/versions/3.5.7/envs/work_env/lib/python3.5/site-packages/django/db/models/base.py", line 708, in save
    force_update=force_update, update_fields=update_fields)
  File "/Users/ds/.pyenv/versions/3.5.7/envs/work_env/lib/python3.5/site-packages/django/db/models/base.py", line 736, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/Users/ds/.pyenv/versions/3.5.7/envs/work_env/lib/python3.5/site-packages/django/db/models/base.py", line 805, in _save_table
    raise DatabaseError("Save with update_fields did not affect any rows.")
django.db.utils.DatabaseError: Save with update_fields did not affect any rows.

Образец Код для воспроизведения этого:

from django.test import TestCase, LiveServerTestCase

from paths.factories import UserFactory


class ATestClass(LiveServerTestCase):

    @classmethod
    def setUpClass(cls):
        """
        Test Data common across all tests
        """

        super().setUpClass()

        cls.user = UserFactory(is_staff=False, is_superuser=False)

    def test_one(self):
        """
        Login and then do some actions
        """
        self.client.force_login(self.user)

        # do something
        self.assertTrue(True)

    def test_two(self):
        """
        Login and do some actions
        """

        self.client.force_login(self.user)

        # do something
        self.assertFalse(False)

Что сработало?

  • Если я заменил LiveServerTestCase на TestCase, он работает как положено. Однако, поскольку мне нужен доступ к live_server_url, мне нужно наследовать от LiveServerTestCase для моего варианта использования

Почему LiveServerTestCase?

  • Моему тестовому классу нужен доступ к live_server_url.

Что я пробовал?

  • Я пытался переместить оператор force_login в * Метод 1057 * вместо входа в систему с помощью метода теста - не помогает
  • Я попытался отключить сигнал update_last_login user_logged_in.disconnect(update_last_login) - Пока сигнал отключился, и это позволило тесту пройти (т. Е. * Оператор 1062 * во втором тесте прошел без каких-либо ошибок во время выполнения, но фактический вход в систему не удался, и API, который я тестировал, вернул 403, запрещенный
  • Я попытался установить атрибут last_login для self.user объекта равным None до оператора force_login - не помогает.

Но Django версия устарела

  • Я знаю, но по причинам за пределами мой контроль, я не могу обновить Django версию. Я ищу какой-то работающий патч в моих собственных тестах, которые Я могу использовать, чтобы мой вариант использования работал.
...