Django: определять форму по-разному в режиме тестирования
У меня есть настроенное поле капчи. Я хочу удалить это поле из формы при отображении во время тестов.
Моей первоначальной мыслью было иметь TESTING
переменная в отдельном файле настроек, который будет предоставлен в качестве аргумента команды запуска теста. Тогда я мог бы что-то вроде:
class CaptchaForm(forms.Form):
notify_email = forms.EmailField(required=False)
if not settings.TESTING:
recaptcha = CaptchaField()
Я считаю, что это должно работать.
Там может быть еще лучший подход. Есть идеи?
Обновить
После игры с предложениями ниже, я добавил это в папку тестовой __init__.py
:
from project.app.forms import CaptchaField
CaptchaField.clean = lambda x, y: y
Это сработало --- без создания общего TESTING
установка. Это выглядит приемлемо? Есть ли причина, по которой я не должен этого делать?
2 ответа
Вы можете отключить капчу в конструкторе класса юнит-тестирования. Как это:
class MyTest(unittest.TestCase):
def __init__(self, *args, **kwargs):
super(MyTest, self).__init__(*args, **kwargs)
settings.TESTING = True
Или вы можете отключить проверку поля капчи в этом конструкторе, например.
Я предполагаю CaptchaField
это твой собственный класс. Тогда вы можете изменить метод проверки:
from django.core.exceptions import ValidationError
class CaptchaField(Field):
# ...
def validate(self, value, model_instance):
if settings.TESTING:
return
else:
# Do CAPTCHA checking, leading to either
# raise ValidationError or
# return
Как уже упоминалось, человек действительно не нуждается в отдельном файле настроек, но может изменить настройку внутри класса юнит-теста.