【问题标题】:Python Unit test with i18 but without webapp2使用 i18 但没有 webapp2 的 Python 单元测试
【发布时间】:2012-09-27 01:02:22
【问题描述】:

我在项目中使用 i18 时遇到了单元测试问题。 我的项目使用框架 i18 和 webapp2 该函数使用 i18 的翻译。但是当我测试时,我得到了错误——缺少全局变量请求。 例如它是:

from unittest import TestCase, main
from webapp2_extras.i18n import lazy_gettext as _

def Hello(a):
    if a > 0:
       message = _('My great message!11 a > 0')
    else:
       message = _('My great message!11 a =< 0')
    return message

class TestHandler(TestCase):

    def testHello0(self):
        self.assertEqual(Hello(0), 'My great message!11 a =< 0')

    def testHello3(self):
        self.assertEqual(Hello(3), 'My great message!11 a > 0')

if __name__ == '__main__':
     main()

我有消息:

FAIL: testHello0 (text3.TestHandler)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/text3.py", line 14, in testHello0
    self.assertEqual(Hello(0), 'My great message!11 a =< 0')
AssertionError: Request global variable is not set.

我有解决这个问题的方法,但我不喜欢它。这是拐杖。如何在不使用相似性 webapp2 上的框架的情况下测试我的功能

from unittest import TestCase, main
from webapp2_extras.i18n import lazy_gettext as _
import webapp2

def Hello(a):
    if a > 0:
        message = _('My great message!11 a > 0')
    else:
        message = _('My great message!11 a =< 0')
    return message


class OneHandler(webapp2.RequestHandler):
    def get(self):
        myNumber = self.request.get('myNumber')
        myNumber = int(myNumber)
        message = Hello(myNumber)
        self.response.write(message)


routes = [('/One', OneHandler)]
app = webapp2.WSGIApplication(routes = routes)

class TestHandler(TestCase):

    def testHello0(self):
        myNumber = 0
        URL = '/One?myNumber=%s' % myNumber

        self.response = app.get_response(URL)
        self.mess = self.response.body
        self.assertEqual(self.mess, 'My great message!11 a =< 0') 

    def testHello3(self):
        myNumber = 3
        URL = '/One?myNumber=%s' % myNumber

        self.response = app.get_response(URL)
        self.mess = self.response.body
        self.assertEqual(self.mess, 'My great message!11 a > 0') 


if __name__ == '__main__':
    main()

干得好!

在 0.047 秒内运行 2 次测试

好的

但这不是一个好的解决方案。如何测试我的功能而不使用 webapp2 等?

【问题讨论】:

    标签: python unit-testing google-app-engine webapp2 python-babel


    【解决方案1】:

    只是不要测试外部代码并修补您的 _lazy 函数

    from unittest import TestCase
    import fudge
    
    from path.to import fun
    # def fun(msg):
    #     return _lazy("foo %s") % msg
    
    class TestHandler(TestCase):
        @fudge.patch("path.to._lazy")
        def test_foo(self, fake_lazy)
            fake_lazy.is_callable().calls(lambda s, **kw: s)
            self.assertEqual(fun("bar"), "foo bar")
    

    【讨论】:

      【解决方案2】:

      我在文件 TEXT31.py 中删除了我的函数 Hello()。 之后我使用了下一个代码:

      from unittest import TestCase, main
      import TEXT31
      
      def dummy_gettext(message):
          return message
      
      TEXT31._ = dummy_gettext # original _-function requires webapp2 environment
      
      class TestHandler(TestCase):
      
          def testHello0(self):
              self.assertEqual(TEXT31.Hello(0), 'My great message!11 a =< 0')
      
          def testHello3(self):
              self.assertEqual(TEXT31.Hello(3), 'My great message!11 a > 0')
      
      if __name__ == '__main__':
          main()
      

      干得好! 我放松...

      【讨论】:

        猜你喜欢
        • 2013-02-04
        • 1970-01-01
        • 2014-03-11
        • 2018-02-14
        • 2015-02-23
        • 2013-06-30
        • 2011-11-19
        • 1970-01-01
        • 2020-09-05
        相关资源
        最近更新 更多