Django request.user 修改未在测试中发生
Django request.user modification not happening in test
我有一个视图正在更改 request.user
的字段:
def test(request):
request.user.is_provider = False
request.user.save()
print(request.user.is_provider)
return HttpResponse(status=200)
现在我正在测试功能,我有以下测试:
class RoleSwitchTests(TestCase):
def test_switch_to_customer(self):
User = get_user_model()
user = User.objects.create_user(
username='test',
email='test',
password='test',
first_name='test',
last_name='test',
is_provider=True,
is_admin=False,
)
self.client.login(username='test', password='test')
response = self.client.post('/test/', follow=True)
print(user.is_provider)
self.assertEqual(response.status_code, 200)
self.assertFalse(user.is_provider)
self.assertFalse(user.is_provider)
在这里失败了。由于某种原因,request.user.is_provider
在 test
中是 False
,但在 test_switch_to_customer
中,user.is_provider
是 True
。我知道这些指的是同一个用户,因为它们具有相同的 id
,那么为什么这里没有保留修改?
视图和测试在不同的 User
对象上工作,它们都具有相同的主键。因此,视图所做的更改不会在测试的 user
中完成。
您可以重新获取 User
对象,例如:
class RoleSwitchTests(TestCase):
def test_switch_to_customer(self):
User = get_user_model()
user = User.objects.create_user(
username='test',
email='test',
password='test',
first_name='test',
last_name='test',
is_provider=True,
is_admin=False,
)
self.client.login(username='test', password='test')
response = self.client.post('/test/', follow=True)
<b>user = User.objects.get(pk=user.pk)</b> # fetch from database
print(user.is_provider)
self.assertEqual(response.status_code, 200)
self.assertFalse(user.is_provider)
您应该在 post
之后使用 refresh_from_db 从数据库重新加载更新后的用户
user.refresh_from_db()
我有一个视图正在更改 request.user
的字段:
def test(request):
request.user.is_provider = False
request.user.save()
print(request.user.is_provider)
return HttpResponse(status=200)
现在我正在测试功能,我有以下测试:
class RoleSwitchTests(TestCase):
def test_switch_to_customer(self):
User = get_user_model()
user = User.objects.create_user(
username='test',
email='test',
password='test',
first_name='test',
last_name='test',
is_provider=True,
is_admin=False,
)
self.client.login(username='test', password='test')
response = self.client.post('/test/', follow=True)
print(user.is_provider)
self.assertEqual(response.status_code, 200)
self.assertFalse(user.is_provider)
self.assertFalse(user.is_provider)
在这里失败了。由于某种原因,request.user.is_provider
在 test
中是 False
,但在 test_switch_to_customer
中,user.is_provider
是 True
。我知道这些指的是同一个用户,因为它们具有相同的 id
,那么为什么这里没有保留修改?
视图和测试在不同的 User
对象上工作,它们都具有相同的主键。因此,视图所做的更改不会在测试的 user
中完成。
您可以重新获取 User
对象,例如:
class RoleSwitchTests(TestCase):
def test_switch_to_customer(self):
User = get_user_model()
user = User.objects.create_user(
username='test',
email='test',
password='test',
first_name='test',
last_name='test',
is_provider=True,
is_admin=False,
)
self.client.login(username='test', password='test')
response = self.client.post('/test/', follow=True)
<b>user = User.objects.get(pk=user.pk)</b> # fetch from database
print(user.is_provider)
self.assertEqual(response.status_code, 200)
self.assertFalse(user.is_provider)
您应该在 post
之后使用 refresh_from_db 从数据库重新加载更新后的用户user.refresh_from_db()