我正在尝试为包含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
条件,则测试运行得很好。有没有办法在测试期间摆脱验证码?
答案 0 :(得分:0)