简体   繁体   English

Django request.user 修改未在测试中发生

[英]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_providertestFalse ,但在test_switch_to_customeruser.is_providerTrue 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM