django - Django LiveServerTestCase - 无法在多个测试中强制登录
问题描述
版本
- Django 版本: 1.9
- 蟒蛇: 3.5
- Django 休息框架: 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
语句移动到setUp
方法而不是在测试方法中进行登录 - 没有帮助 - 我尝试断开
update_last_login
信号user_logged_in.disconnect(update_last_login)
- 当信号断开时,这允许测试继续进行(即force_login
第二个测试中的语句通过没有任何运行时错误,但实际登录失败并且我正在测试的 API,返回 403 禁止 - 我尝试在声明之前将对象的
last_login
属性设置为- 没有帮助。self.user
None
force_login
但是 Django 版本很旧
- 我知道,但由于我无法控制的原因,我无法升级 Django 版本。我正在我自己的测试中寻找一些可行的补丁,我可以用它来让我的用例工作。
解决方案
推荐阅读
- r - R扫描字符的数据帧,但仅在参数列中
- javascript - 使用 Blazor WASM,我想在窗口打开时显示浏览器窗口的尺寸
- android - 如何在 Firebase Android 中使用多个 WhereIn 查询?
- python - 读取嵌套字典中的 csv 文件存储数据
- python - 如何有效地调用多个变量的方法?
- python - 如何解决我的点击并不总是准确的问题
- sql-server - 如何在 Azure Data Studio 中折叠所有区域
- mysql - 如果新值不为空,如何更新行字段
- shopify - Shopify - 将文件 CSV 订购到文本文件
- c++ - 解码霍夫曼树 C++