2012-05-31 30 views
8

我使用Django Internationalization工具来从我的应用程序中翻译一些字符串。代码如下所示:如何在django的单元测试期间禁用翻译?

from django.utils.translation import ugettext as _ 
def my_view(request): 
    output = _("Welcome to my site.") 
    return HttpResponse(output) 

然后,我正在写使用Django test client单元测试。这些测试向视图发出请求并比较返回的内容。

如何在运行单元测试时禁用翻译?我的目标要做到这一点:

class FoobarTestCase(unittest.TestCase): 
    def setUp(self): 
     # Do something here to disable the string translation. But what? 
     # I've already tried this, but it didn't work: 
     django.utils.translation.deactivate_all() 
    def testFoobar(self): 
     c = Client() 
     response = c.get("/foobar") 
     # I want to compare to the original string without translations. 
     self.assertEquals(response.content.strip(), "Welcome to my site.") 

回答

2

我解决了这个同样的问题从@DenilsonSá的回答中获得方法4。事实证明,这不需要任何测试特定的设置文件,并且可以使用由django提供的修饰器或上下文管理器在每个测试的基础上定义(参见overriding settings)。

它可用于这样的:

from django.test import TestCase, override_settings 

class MyTest(TestCase): 
    @override_settings(LANGUAGE_CODE='en-US', LANGUAGES=(('en', 'English'),)) 
    def test_mypage(self): 
     // ... 

装饰器也可以应用到整个测试用例的子类,或甚至更精细的控制也有一个上下文管理器(见上面链接的文档)。

正在这个相当普遍的对于我来说,我也定义:

english = override_settings(
    LANGUAGE_CODE='en-US', 
    LANGUAGES=(('en', 'English'),), 
) 

所以,现在我可以简单地在需要它的测试用例使用@english

1

我认为这将更有意义,正义的力量的语言,为您的单元测试已知的设置。这意味着你正在测试更接近实际实现的东西。

要激活,你可以在你的安装做这个特定的语言:

from django.utils.translation import activate 
... 
activate('en-en') 
+0

这可能是一个好主意,你有如何实现这一目标的建议? –

+0

试试这个:http://stackoverflow.com/a/9843158/15369 –

+2

仅供参考,您的答案不起作用,由于我在我自己的答案中解释的原因。不错,尽管如此,但它根本行不通。 –

11

测试客户端调用.get().post()将运行配置的所有中间件。这意味着它也将运行LocaleMiddleware,这将呼叫translation.get_language_from_request(),然后是translation.activate(language)

这意味着当使用测试客户端编写测试时,当前活动的语言将被忽略并丢弃。换句话说,下面的代码无法正常工作:

def testFoobar(self): 
    c = Client() 
    # This will not work. 
    translation.deactivate_all() 
    # This will not work either. 
    translation.activate('en-us') 
    # The next call will override the earlier activate/deactivate calls. 
    response = c.get("/foobar") 

有几个解决方案:

  1. 在会话对象设置所需的语言。
  2. 在cookie中设置所需的语言。
  3. 发送HTTP_ACCEPT_LANGUAGE标题。
  4. 设置settings.LANGUAGE_CODE

源(From Django的1.4,但它是因为1.1大多持平或更早):

相关问题