Django:在测试模式下不同定义表单

2 投票
2 回答
627 浏览
提问于 2025-04-16 07:41

我有一个自定义的验证码字段。在测试时,我想从表单中去掉这个字段。

我最开始的想法是在一个单独的设置文件里加一个 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 个回答

0

我猜你提到的 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

正如werehuman已经提到的,你其实不需要单独的设置文件,可以直接在单元测试类里面修改设置。

2

你可以在单元测试类的构造函数里关闭验证码。就像这样:

class MyTest(unittest.TestCase):
    def __init__(self, *args, **kwargs):
         super(MyTest, self).__init__(*args, **kwargs)
         settings.TESTING = True

或者你也可以在这个构造函数里关闭验证码字段的验证,比如说。

撰写回答