4

我正在将webapp2和webapp2_extras.i18n用于Google App Engine应用程序。在单元测试中使用webapp2 i18n

我有一个单元测试脚本底部描述如下:https://developers.google.com/appengine/docs/python/tools/localunittesting

测试脚本进口车型,不包括webapp2的处理程序,因为测试的目标是业务逻辑代码,而不是请求和回应。不过,我的一些车型将调用国际化功能,如format_currencygettext,这将导致一个错误:

AssertionError: Request global variable is not set. 

我怎么能初始化国际化模块没有实例化一个webapp2的应用程序和要求?

回答

0

试着嘲笑你的功能。

例子:我有一个导入国际化这样的脚本调用用户:

from webapp2_extras.i18n import gettext as _ 

所以,在我的测试中,我嘲讽的功能是这样的:

from pswdless.model import PswdUserEmail, EmailUserArc 
from pswdless.users import FindOrCreateUser 
from pswdless import users 

# mocking i18n 
users._ = lambda s: s 

#your tests bellow 

您可以使用同样的伎俩与另一功能。

我希望它能帮助你。

4

我有同样的问题(但uri_for),我终于实现了我的测试如下:

app = webapp2.WSGIApplication(
     [webapp2.Route('/', None, name='upload_handler')]) 

request = webapp2.Request({'SERVER_NAME':'test', 'SERVER_PORT':80, 
    'wsgi.url_scheme':'http'}) 
request.app = app 
app.set_globals(app=app, request=request) 

# call function that uses uri_for('upload_handler') 

我不得不做的试验和错误猜测变量必须在将被设置的环境请求。也许你需要添加更多以调用i18n。

+0

这是对的,代码单元测试有所帮助:'i18n.get_i18n()set_locale()' – 2017-05-29 19:13:16

+0

谢谢,我有这个做到今天,在2017年:) – patrick 2017-08-22 17:03:05

0

模拟i18n本身似乎很简单。我更喜欢这种方法,因为Request和app在单元测试中确实不需要。

下面是一个示例pytest夹具:

@pytest.fixture 
def mock_i18n(monkeypatch): 

    class MockI18n: 

     def set_locale(self, locale): 
      pass 

     def gettext(self, string, **variables): 
      return string 

    mock_i18n = MockI18n() 

    def mock_get_i18n(factory=None, key=None, request=None): 
     return mock_i18n 

    from webapp2_extras import i18n 
    monkeypatch.setattr(i18n, 'get_i18n', mock_get_i18n) 

    yield 
0

嘲讽似乎是走在这里的方式,但其他的答案是不完整的和/或超过必要的复杂。这是一个简单的模拟,适合我。

=== my_module.py === 

from webapp2_extras.i18n import gettext as _ 

def f(x): 
    return _(x) 

=== test_my_module.py === 

import my_module 

def _mock(x): 
    return x 

@mock.patch("my_module._", side_effect=_mock) 
def test_f(self, foo): 
    y = my_module.f("hello") 
    self.assertEqual(y, "hello")