【问题标题】:Django request.user modification not happening in test测试中未发生 Django request.user 修改
【发布时间】:2020-03-29 20:50:46
【问题描述】:

我有一个视图正在更改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_providertest 中是False,但在test_switch_to_customer 中,user.is_providerTrue。我知道这些指的是同一个用户,因为他们有相同的id,那么为什么这里没有保留修改?

【问题讨论】:

    标签: python django django-testing


    【解决方案1】:

    您应该在发布后使​​用refresh_from_db 从数据库中重新加载更新的用户

    user.refresh_from_db()
    

    【讨论】:

      【解决方案2】:

      视图和测试正在处理不同的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)
              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)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-11
        • 1970-01-01
        • 2021-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-26
        • 1970-01-01
        相关资源
        最近更新 更多