Модульный тест Python с i18, но без webapp2

I encountered a problem with unit tests when use i18 in my project. My project uses framewoks i18 and webapp2 The function uses the translation by i18. But when I test, I get the error - missing global variable request. For example it is:

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()

and I have message:

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()

и молодец!

Ran 2 tests in 0.047s

OK

Но это не очень хорошее решение. Как я могу протестировать свою функцию и не использовать webapp2 и т. д.?


person saga111a    schedule 05.10.2012    source источник


Ответы (2)


просто не тестируйте внешний код и исправьте свою функцию _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")
person diefans    schedule 22.01.2013

Я удалил свою функцию Hello() в файле TEXT31.py. и после этого я использовал следующий код:

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()

Отличная работа! Я расслабляюсь...

person saga111a    schedule 06.10.2012