测试Django国际化Mocking gettex

2024-05-20 19:54:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在国际化一个django项目。我们有一个部分独立运行并执行后台任务。它叫rabbitmq。我想测试一下i18n/l10n是否适用于该部件。但是我们的应用程序还没有被翻译,而且在一段时间内不会被翻译。我想在翻译开始之前编写单元测试。在

我想模拟一些翻译,以便_("anything")作为常量字符串返回,这样我就可以测试它是否在尝试翻译,而不需要设置所有的翻译。在

我尝试使用mock,但是with mock.patch('django.utils.translations.ugettext_lazy'), my_function_that_just_returns_one_string):不起作用。_作为from django.utils.translations import ugettext_lazy as _导入。在


Tags: 项目django应用程序部件rabbitmql10nutils单元测试
3条回答

您可以执行以下操作来替换默认转换对象上的ugettext方法:

from django.utils.translation.trans_real import get_language, translation

translation(get_language()).ugettext = mock_ugettext

我找不到一个现有的方法来做这个。然而,在阅读Django源代码之后,我想出了一种既老套又脆弱的方法,通过查看活动的DjangoTranslation对象,然后包装它们的ugettext方法。我在这里描述过:http://www.technomancy.org/python/django-i18n-test-translation-by-manually-setting-translations/

我看过您的解决方案,我认为在没有提供翻译字符串的情况下,测试i18n支持既巧妙又简单。但是我担心translation包总是有效的,而且我们认为这是理所当然的,所以在大量注释的测试代码中看到它的内部结构,至少会让我害怕(咯咯笑)。在

我认为创建一个测试应用程序,添加到测试设置中的INSTALLED_APPS中,它提供了它自己的翻译,这是一种更简洁的方法。您的测试将简化为translation.activate('fr'); self.assertEqual('xxx_anything', gettext('anything'), 'i18n support should be activated.')。在

通过简单的测试,其他开发人员可以快速跟进并看到测试应用程序的包包含一个/locale目录,该目录应立即记录您的方法。在

相关问题 更多 >