在django单元测试中,如果发生BadHeaderError,引发异常的最佳方法是什么?

wqsoz72f  于 2023-01-14  发布在  Go
关注(0)|答案(1)|浏览(151)

测试失败并显示错误响应,这意味着它可能允许带有错误数据的电子邮件,但它应该按预期抛出HttpResponse,我试图找出为什么我的测试失败并返回200 http状态代码,但不像预期的那样= 400。

重置密码

class ResetPassword(View):
    form_class = ForgetPasswordForm()
    template_name = 'authentication/password_reset.html'
    def get(self, request):
        form = self.form_class
        return render(request, self.template_name, {'form': form})

    def post(self, request):
        msg = None
        form = ForgetPasswordForm(request.POST)
        if form.is_valid():
            data = form.cleaned_data.get('email')
            associated_users = Users.objects.filter(Q(email = data))
            if associated_users.exists():
                for user in associated_users:
                    subject = 'Password Reset Requested'
                    email_template_name = "authentication/password_reset_email.txt"
                    c = {
                        "email": user.email,
                        'domain': '127.0.0.1:8000',
                        'site_name': 'ATB Project Organizer',
                        'uid': urlsafe_base64_encode(force_bytes(user.pk)),
                        'user': user,
                        'token': default_token_generator.make_token(user),
                        'protocol': 'http',
                    }
                    email = render_to_string(email_template_name, c)
                    try:
                        send_mail(subject, email, 'admin@example.com', [user.email], fail_silently=False)
                    except BadHeaderError:
                        return HttpResponse('Invalid header found')
                    msg = 'You have successfully reset your password!'
                    return redirect('/password_reset/done/')
            else:
                msg = 'No records found for this email, please make sure you have entered the correct email address!'
        form = ForgetPasswordForm()
        return render(request, 'authentication/password_reset.html', {'form': form, 'msg': msg})

测试以引发异常

from django.test import TestCase
from django.urls import reverse
from django.core import mail
from django.contrib.auth import get_user_model

User = get_user_model()

class PasswordResetTest(TestCase):
    def setUp(self):
        self.user1 = User.objects.create_user("user1", email = "user1@mail.com", password = "password@121", orcid = '1234567890987654')
        self.user2 = User.objects.create_user("user2", email = "user2@mail.com", password = "password@122", orcid = '1234567890987655')
        self.user3 = User.objects.create_user("user3@mail.com", email = "not-that-mail@mail.com", password = "password@123", orcid = '1234567890987656')
        self.user4 = User.objects.create_user("user4", email = "user4@mail.com", password = "passs", orcid = '1234567890987657')
        self.user5 = User.objects.create_user("user5", email = "uѕer5@mail.com", password = "password@125", orcid = '1234567890987658')  # email contains kyrillic s

        self.user={
            'username':'username',
            'email':'testemail@gmail.com',
            'password1':'password@123',
            'password2':'password@123',
            'orcid': '1234123412341239',
        }

    def test_user_can_resetpassword(self):
        response = self.client.get(reverse('resetpassword'))
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'authentication/password_reset.html')

        # Then test that the user doesn't have an "email address" and so is not registered
        response = self.client.post(reverse('resetpassword'), {'email': 'admin@example.com'}, follow=True)
        self.assertEqual(response.status_code, 200)
       
        # Then test that the user doesn't have an "email address" and so is not registered
         # Then post the response with our "email address"

        # Then post the response with our "email address"
        response = self.client.post(reverse('resetpassword'),{'email':'user1@mail.com'})
        self.assertEqual(response.status_code, 302)
        # At this point the system will "send" us an email. We can "check" it thusly:
        self.assertEqual(len(mail.outbox), 1)
        self.assertEqual(mail.outbox[0].subject, 'Password Reset Requested')
    
    def test_exception_raised(self):
        # verify the email with wrong data
        data = {"uid": "wrong-uid", "token": "wrong-token"}
        response = self.client.post(reverse('resetpassword'), data, format='text/html')
        self.assertEqual(response.status_code, 400)

错误

文件“../tests/test_passwordreset.py”,第55行,在测试异常引发中

self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

Assert错误:二百!=四百

失败代码

mzsu5hc0

mzsu5hc01#

示例化HttpResponse类时默认的HTTP状态代码是200(OK),这就是测试失败的原因。
试试这个:

...
except BadHeaderError:
    return HttpResponse('Invalid header found', status=400)
    # Or more verbose:
    # return HttpResponse('Invalid header found', status=HttpStatus.BAD_REQUEST)
...

...
except BadHeaderError:
    return HttpResponseBadRequest('Invalid header found')
...

更多详情请参见文档。

相关问题