Posterior a de nuestra larga selección de información pudimos resolver esta problema que suelen tener algunos de nuestros lectores. Te regalamos la solución y nuestro objetivo es que resulte de gran ayuda.
Solución:
Sé que esta es una publicación anterior, pero django-simple-captcha ahora tiene una configuración CAPTCHA_TEST_MODE que hace que el captcha tenga éxito si proporciona el valor ‘APROBADO’. Solo debe asegurarse de enviar algo para ambos campos de entrada de captcha:
post_data['captcha_0'] = 'dummy-value'
post_data['captcha_1'] = 'PASSED'
self.client.post(url, data=post_data)
La configuración CAPTCHA_TEST_MODE solo debe usarse durante las pruebas. Mi configuración.py:
if 'test' in sys.argv:
CAPTCHA_TEST_MODE = True
Esta es la forma en que lo solucioné. Importe el modelo que realmente contiene información de Captcha:
from captcha.models import CaptchaStore
Primero, verifico que la tabla captcha de prueba esté vacía:
captcha_count = CaptchaStore.objects.count()
self.failUnlessEqual(captcha_count, 0)
Después de cargar la página (en este caso, es una página de registro), verifique que haya una nueva instancia de objeto captcha:
captcha_count = CaptchaStore.objects.count()
self.failUnlessEqual(captcha_count, 1)
Luego, recupero los datos de la instancia de captcha y los POST con el formulario. En mi caso, POST espera que ‘captcha_0’ contenga el hashkey y ‘captcha_1’ contenga la respuesta.
captcha = CaptchaStore.objects.all()[0]
registration_data = # other registration data here
'captcha_0': captcha.hashkey,
'captcha_1': captcha.response
Es posible que deba modificar esto un poco si comienza con las instancias de CaptchaStore antes de ejecutar esta prueba. Espero que ayude.
yo unidad probada burlándose del ReCaptchaField. Primero, agregué el campo recaptcha en el constructor. No se puede agregar como un campo regular porque no podrá simularlo (una vez que se evalúe el código antes de aplicar el simulacro):
class MyForm(forms.ModelForm):
...
def __init__(self, *args, **kwargs):
# Add captcha in the constructor to allow mock it
self.fields["captcha"] = ReCaptchaField()
Luego, simplemente reemplacé ReCaptchaField por un CharField no requerido. De esta manera, confío en que django-recaptcha funcionará. Solo puedo probar mis propias cosas:
@mock.patch("trials.forms.ReCaptchaField", lambda: CharField(required=False))
def test_my_stuff(self):
response = self.client.post(self.url, data_without_captcha)
self.assert_my_response_fit_the_needs(response)