Django测试,出现本地化错误消息
我正在使用Django本地化迈出第一步,我刚刚遇到了第一个困难。我正在尝试测试模型中的某些东西是否按预期工作。对于无效输入,应出现特定的ValidationError。测试中的代码如下所示:Django测试,出现本地化错误消息,django,testing,localization,Django,Testing,Localization,我正在使用Django本地化迈出第一步,我刚刚遇到了第一个困难。我正在尝试测试模型中的某些东西是否按预期工作。对于无效输入,应出现特定的ValidationError。测试中的代码如下所示: try: p = ... p.full_clean() self.fail('Expected exception not raised') except ValidationError as e: dict_err = dict(e) self.assertIn('
try:
p = ...
p.full_clean()
self.fail('Expected exception not raised')
except ValidationError as e:
dict_err = dict(e)
self.assertIn('category', dict_err.keys())
self.assertEqual(len(dict_err.keys()), 1, 'Encountered more than one error')
self.assertIn('blank', dict_err['category'][0])
ValidationError({'category': ['This field cannot be blank.']})
只要站点使用英语(LANGUAGE\u code='en-uk'
),捕获的错误如下所示:
try:
p = ...
p.full_clean()
self.fail('Expected exception not raised')
except ValidationError as e:
dict_err = dict(e)
self.assertIn('category', dict_err.keys())
self.assertEqual(len(dict_err.keys()), 1, 'Encountered more than one error')
self.assertIn('blank', dict_err['category'][0])
ValidationError({'category': ['This field cannot be blank.']})
为了检查我是否得到了这个ValidationError,我正在错误消息(上面代码的最后一行)中搜索工作“blank”
当我把网站切换到另一种语言时,它就失败了。例如,对于德语,它看起来是这样的:
ValidationError({'category': ['Dieses Feld darf nicht leer sein.']})
寻找“空白”显然无法通过测试。如何检查错误消息?我希望,在Django的深处,应该有这个消息的唯一标识符(以便Django知道如何翻译)。但是我在错误值中没有看到任何它的痕迹。我期待着类似的事情
self.assertIn(_(id), dict_err['category'][0])
如果我能猜出
id
应该是什么,如果我能正确理解(
)的功能,我就能做到这一点。通过进一步的尝试和错误,我发现对于简单的消息,消息id就是原始的英语消息。也就是说,我们可以做到:
...
expected_error = _("This field cannot be blank.")
self.assertIn(expected_error, dict_err['category'][0])
甚至
self.assertEqual(expected_error, dict_err['category'][0])
它独立于站点语言工作
对于使用命名字符串插值的错误,代码如下所示。假设英语错误消息为值“x”不是有效的选择。
,我们会:
expected_error = _("Value %(value)r is not a valid choice.") % {'value': 'x'}
self.assertEqual(expected_error, dict_err['category'][0])
我发现确定相应消息ID的最简单方法是在venv文件中搜索英文错误消息的部分。例如,我发现上面搜索“is not a valid choice”时出错,这显然是消息中不可变的部分
特别感谢@MosesKoledoye:他对我的问题的评论暗示了正确的方向。但是在这种情况下,你知道假定的id是
'blank'
,那么为什么不('blank')
?@MosesKoledoye,因为('blank')
只返回blank
,它不是消息ID。我只是希望如果错误消息中存在“blank”一词,那么错误消息很可能就是相关的消息。如果Django项目团队明天决定将“此字段不能为空”更改为“不允许为空字段”,那么它也应该起作用。