Django-对包含Recaptcha的表单进行单元测试

时间:2020-07-23 12:55:55

标签: python django unit-testing recaptcha captcha

我正在尝试为包含Recaptcha的表单编写单元测试:

我的联系人视图如下:

@check_recaptcha
def contact(request):
    if request.method == 'POST':
        f = ContactForm(request.POST)
        if f.is_valid() and request.recaptcha_is_valid:

            f.save(request)
            messages.add_message(request, messages.INFO, "Thanks for submitting feedback!")


            return redirect('contact')
    else:
        f = ContactForm()

    return render(request, 'cms/contact.html', {'form': f})

装饰器check_recaptcha()的定义如下:

def check_recaptcha(view_func):
    @wraps(view_func)
    def _wrapped_view(request, *args, **kwargs):
        request.recaptcha_is_valid = None

        if settings.DEBUG:
            request.recaptcha_is_valid = True
            return view_func(request, *args, **kwargs)

        if request.method == 'POST':
            recaptcha_response = request.POST.get('g-recaptcha-response')
            data = {
                'secret': settings.GOOGLE_RECAPTCHA_SECRET_KEY,
                'response': recaptcha_response
            }
            r = requests.post('https://www.google.com/recaptcha/api/siteverify', data=data)
            result = r.json()
            if result['success']:
                request.recaptcha_is_valid = True
            else:
                request.recaptcha_is_valid = False
                messages.error(request, 'Invalid reCAPTCHA. Please try again.')

        return view_func(request, *args, **kwargs)
    return _wrapped_view

用于测试联系表的代码如下:

class TestContactForm(TestCase):

    def test_can_send_feedback(self):
        data = {
            "name": "tom",
            "email": "tom@test.com",
            "subject": "A test subject",
            "message": "Hello jerry",
        }

        response = self.client.post(reverse('contact'), data=data)
        self.assertEqual(Feedback.objects.count(), 1)
        self.assertEquals(response.status_code, 302)
        self.assertRedirects(response, reverse('contact'))

如果我在request.recaptcha_is_valid视图中删除了contact条件,则测试运行得很好。有没有办法在测试期间摆脱验证码?

1 个答案:

答案 0 :(得分:0)

相关问题