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

时间:2019-02-16 21:00:01

标签: django django-testing

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

resp = self.client.get(link)

new_user.refresh_from_db()

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

请参阅documentation