Django测试,发布本地化错误消息

时间:2018-08-18 21:34:35

标签: 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('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应该是什么,并且如果我正确地理解_()可以做什么,就会做到这一点。

1 个答案:

答案 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:他对我的问题的评论暗示了正确的方向。