2012-10-05 19 views
1

在我的項目中使用i18時,我遇到了單元測試的問題。 我的項目使用framewoks i18和webapp2 該函數使用i18的翻譯。但是當我測試時,我得到了錯誤 - 缺少全局變量請求。 例如,它是: 使用i18但沒有webapp2的Python單元測試

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. 

我有一個解決這個問題,但我不喜歡它。這是一個柺杖。你怎麼能測試我的功能,而不使用framewoks的相似性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等?

回答

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

做得好! 我放鬆......

相關問題