[英]Django request.user modification not happening in test
I have a view that is changing a field of request.user
:我有一个视图正在更改request.user
的字段:
def test(request):
request.user.is_provider = False
request.user.save()
print(request.user.is_provider)
return HttpResponse(status=200)
Now I am testing the function and I have the following test:现在我正在测试该功能,并进行以下测试:
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)
fails here. self.assertFalse(user.is_provider)
在这里失败。 For some reason, request.user.is_provider
is False
in test
, but in test_switch_to_customer
, user.is_provider
is True
.出于某种原因, request.user.is_provider
在test
为False
,但在test_switch_to_customer
, user.is_provider
为True
。 I know these refer to the same user because they have the same id
, so why is the modification not being preserved here?我知道这些是指同一个用户,因为它们具有相同的id
,那么为什么这里没有保留修改?
The view and the test are working on different User
objects, that both have the same primary key.视图和测试正在处理不同的User
对象,它们都具有相同的主键。 Hence changes made by the view are not done in the user
in the test.因此,视图所做的更改不会在测试中的user
中完成。
You can refetch the User
object, for example with:您可以重新获取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)
user = User.objects.get(pk=user.pk) # fetch from database
print(user.is_provider)
self.assertEqual(response.status_code, 200)
self.assertFalse(user.is_provider)
您应该在发布后使用refresh_from_db从数据库重新加载更新的用户
user.refresh_from_db()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.