1

プロジェクトで 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()

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.

I have a solution to this problem, but I do not like it. This is a crutch. How can you test my function without using framewoks on similarity 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()

and well done!

Ran 2 tests in 0.047s

OK

しかし、それは良い解決策ではありません。自分の機能をテストし、webapp2 などを使用しないようにするにはどうすればよいですか?

4

2 に答える 2

0

外部コードをテストして _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")
于 2013-01-22T17:05:24.013 に答える
0

ファイル 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()

素晴らしい!私はリラックス...

于 2012-10-06T18:51:40.857 に答える