模型验证:我可以访问ValidationError代码吗?

时间:2017-09-04 12:21:21

标签: django validation testing

我有两个直接相关的问题。

Django documentation建议使用代码

引发ValidationError
# Good
ValidationError(_('Invalid value'), code='invalid')

# Bad
ValidationError(_('Invalid value'))

如何在测试中访问此代码?我尝试在捕获的异常中使用as_dataas_json或简单.code的尝试都失败了。不幸的是,我看到的建议都与表单验证有关。我的测试验证了模型。

这与问before几乎是同一个问题(我不使用表格)。

相关问题:上面链接的相同文档页面提供了一些如何引发ValidationError的示例,以及#34; Raising ValidationError"部分建议使用代码,"在实践中使用验证"从来没有提到它,那里的例子不使用代码。我想知道这是否表明这个功能是陈旧的。

1 个答案:

答案 0 :(得分:1)

我学会了如何在PyCharm中调试Django测试,它帮助我找到了解决方案。为了别人的缘故:

错误代码可通过exception.error_dict[field_name][err_no].code访问。例如,以下检查引发了一个非常具体的错误:

def test_negative_photo_number(self):
    """Cannot create photo with negative photo number"""
    with self.assertRaises(ValidationError) as ve_context:
        self.create_photo(album_number=1, photo_number=-2)

    e = ve_context.exception
    print(e.error_dict)
    self.assertEqual(len(e.error_dict.keys()), 1, 'Encountered more than one problematic field')
    self.assertEqual(len(e.error_dict['number']), 1, 'Encountered more than one error')
    self.assertEqual(e.error_dict['number'][0].code, 'min_value')

对于在字段验证器外部引发的ValidationError(例如,通过model.clean方法),将字段名称(上面的“数字”)替换为__all__