我正在为用户验证视图编写测试,但遇到了一些尚不知道如何解决的问题。 因此,这是我正在测试的视图:
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
。
有什么想法吗?
答案 0 :(得分:1)
您需要在执行验证后刷新对象:
resp = self.client.get(link)
new_user.refresh_from_db()
原因是它是一个简单的值字段。创建/检索对象后,此类非延迟字段不会自动从数据库刷新。换句话说,该值是最初在create_user
中设置的值。要获得新值,您必须刷新它。
请参阅documentation。