我想了解为什么此测试用例不起作用:我在我尝试提交空表单时测试我的注册表单会返回错误。
在tests.py中:
class SignupViewTestCase(TestCase):
def test_signup_post_blank(self):
resp = self.client.post(reverse(signup), {}) # blank data dictionary
self.assertFormError(resp, form='signup_form', field='email',
errors='Ce champ est obligatoire') # French version of "This field is mandatory"
在views.py中:
def signup(request):
signup_form = SignupForm(request.POST or None)
if signup_form.is_valid():
ema = signup_form.cleaned_data['email']
raw_pwd = signup_form.cleaned_data['password']
try:
BizProfile.create(ema, raw_pwd)
except IntegrityError:
signup_form.errors['__all__'] = signup_form.error_class([
ERR_USER_EXISTS])
else:
messages.success(request, SUC_ACC_CREA)
messages.info(request, INF_CONN)
return redirect(signin)
return render(request, 'sign_up.html', locals())
在我的浏览器中手动测试时,我可以看到当我提交没有数据时,电子邮件字段实际上存在错误。
但是测试结果说:
AssertionError: The field 'email' on form 'signup_form' in context 0 contains no errors
知道发生了什么?感谢。
答案 0 :(得分:3)
实际上,问题 与or None
。相关
那是因为空字典是假的。在“或”条件下,如果第一个值为false,Python始终返回第二个值。这意味着您的表单仅使用“None”进行实例化,而不是空字典:这意味着它根本没有绑定。非约束表单没有任何错误。
更改测试不是一个好的解决方案,因为浏览器永远不会提交没有值的“email”密钥:没有值的字段根本不会在POST数据中发送,这就是为什么空字典是正确的方法测试一下。您应该使用规范视图模式,而不是更改测试,并删除该断开的快捷方式。
if request.method == 'POST':
signup_form = SignupForm(request.POST)
if signup_form.is_valid():
...
else:
signup_form = SignupForm()
return...