Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django测试,出现本地化错误消息_Django_Testing_Localization - Fatal编程技术网

Django测试,出现本地化错误消息

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('

我正在使用Django本地化迈出第一步,我刚刚遇到了第一个困难。我正在尝试测试模型中的某些东西是否按预期工作。对于无效输入,应出现特定的ValidationError。测试中的代码如下所示:

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项目团队明天决定将“此字段不能为空”更改为“不允许为空字段”,那么它也应该起作用。