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

Как уже упоминалось, человек действительно не нуждается в отдельном файле настроек, но может изменить настройку внутри класса юнит-теста.

Другие вопросы по тегам