为什么Django测试空白数据后不起作用?

时间:2014-08-12 18:23:55

标签: python django unit-testing

我想了解为什么此测试用例不起作用:我在我尝试提交空表单时测试我的注册表单会返回错误。

在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

知道发生了什么?感谢。

1 个答案:

答案 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...