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 个回答
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
或者你也可以在这个构造函数里关闭验证码字段的验证,比如说。