测试用户验证视图时出现问题

Problems testing user verification view

我正在为我的用户验证视图编写测试,我遇到了一些我还不知道如何解决的问题。 所以,这是我正在测试的视图:

def verify(request, uidb64, token):
    try:
        uid = force_text(urlsafe_base64_decode(uidb64))
        user = User.objects.get(pk=uid)
    except(TypeError, ValueError, OverflowError, User.DoesNotExist):
        user = None
    if user is not None and account_activation_token.check_token(user, token):
        user.is_verified = True
        user.save()
        print(user.is_verified)
        return HttpResponse('Your account was activated!')
    else:
        return HttpResponse('Activation link is invalid!')

当我 运行 服务器和用户将他的 is_activated 设置为 True

时,它工作正常

但是,这是一个测试:

    def test_new_user_verification(self):
        new_user = User.objects.create_user('humapen4@gmail.com', 'Abc1234567')
        # visit activation link
        link = reverse('verify',
                       kwargs={'uidb64': urlsafe_base64_encode(force_bytes(new_user.pk)).decode(),
                               'token': account_activation_token.make_token(new_user)})
        resp = self.client.get(link)

        self.assertEqual(resp.status_code, 200)
        self.assertTrue(new_user.is_verified) 

第一个测试顺利通过,但第二个测试失败,因为在测试中 new_user.is_verified 等于 False。我不明白为什么,当我将 print(user.is_verified) 添加到视图时,它打印 True,但在测试中它是 False.

知道为什么吗?

您需要在执行验证后刷新对象:

resp = self.client.get(link)

new_user.refresh_from_db()

原因是它是一个简单的值字段。在对象 created/retrieved 之后,此类非延迟字段不会自动从数据库中刷新。换句话说,该值是最初在 create_user 中设置的值。要获得新值,您必须刷新它。

参考documentation.