2011-03-09 111 views
4

我正在国际化/ i18n-django项目。我们有一部分独立运行并执行后台任务。它由rabbitmq调用。我想测试一下i18n/l10n是如何工作的。然而,我们的应用程序尚未翻译,并且不会有一段时间。我想在翻译开始前编写单元测试。测试django国际化 - 嘲弄gettext

我想嘲笑一些翻译,以便_("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 _

+0

对不起,奇怪的问题,但你为什么要测试一些已经测试过的东西 - https://github.com/bx2/django/blob/master/tests/regressiontests/i18n/tests.py#L46? TDD的基本规则告诉我们,我们必须信任其他开发人员。我认为你想要的是一种矫枉过正。 Django的i18n框架已经被证明是可行的,并且为此进行了测试 - 为什么更复杂? ;) – bx2 2011-03-09 22:26:56

+0

我的代码使用Django的翻译,但它运行在一个单独的过程中,不提供Web请求,我想测试它正在翻译不同的请求中的东西。 – Rory 2011-03-10 09:36:04

回答

1

我已经看过你的解决方案,我认为它既巧妙又简单,用于在没有提供翻译字符串时测试i18n支持。但是恐怕translation包只是一些总是有效的东西,我们认为这是理所当然的,所以在严重评论的测试代码中看到它的内部结构,至少会让我逃避恐惧(笑)。

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

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