我正在使用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])
只要该网站以英语(LANGUAGE_CODE = 'en-uk'
)运行,捕获的错误就看起来像这样:
ValidationError({'category': ['This field cannot be blank.']})
要检查我是否确实有 this ValidationError,我正在错误消息(上面代码的最后一行)中搜索工作“空白”。
将网站切换为另一种语言后,它就会失败。例如。对于德国人来说看起来像这样:
ValidationError({'category': ['Dieses Feld darf nicht leer sein.']})
寻找“空白”显然无法通过测试。如何查看错误消息?我希望在Django的某个深处,应该有此消息的唯一标识符(以便Django知道如何翻译)。但是我在错误值中看不到任何痕迹。我期望像
self.assertIn(_(id), dict_err['category'][0])
如果我能猜出id
应该是什么,并且如果我正确地理解_()
可以做什么,就会做到这一点。
答案 0 :(得分:0)
通过进一步的尝试和错误,我发现对于简单消息,消息ID只是原始的英语消息。也就是说,一个人可以做:
...
expected_error = _("This field cannot be blank.")
self.assertIn(expected_error, dict_err['category'][0])
甚至
self.assertEqual(expected_error, dict_err['category'][0])
它可以独立于站点语言工作。
对于使用命名字符串插值的错误,代码如下所示。假设英语错误消息为Value 'x' is not a valid choice.
,我们这样做:
expected_error = _("Value %(value)r is not a valid choice.") % {'value': 'x'}
self.assertEqual(expected_error, dict_err['category'][0])
我发现确定各个消息ID的最简单方法是在venv文件中搜索英语错误消息的一部分。例如,我发现上面搜索“不是一个有效的选择”的错误,显然这是消息的不变部分。
特别感谢@MosesKoledoye:他对我的问题的评论暗示了正确的方向。