2011-09-17 28 views
10

我想單元測試一個處理程序與webapp2和我跑到什麼必須只是一個愚蠢的小錯誤。如何在單元測試中使用webapp2獲得uri_for?

我希望能夠在測試中使用webapp2.uri_for,但我似乎無法做到這一點:

def test_returns_200_on_home_page(self): 
     response = main.app.get_response(webapp2.uri_for('index')) 
     self.assertEqual(200, response.status_int) 

如果我只是做main.app.get_response('/')它工作得很好。

收到的例外是:

Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/case.py", line 318, in run 
    testMethod() 
    File "tests.py", line 27, in test_returns_200_on_home_page 
    webapp2.uri_for('index') 
    File "/Users/.../webapp2_example/lib/webapp2.py", line 1671, in uri_for 
    return request.app.router.build(request, _name, args, kwargs) 
    File "/Users/.../webapp2_example/lib/webapp2_extras/local.py", line 173, in __getattr__ 
    return getattr(self._get_current_object(), name) 
    File "/Users/.../webapp2_example/lib/webapp2_extras/local.py", line 136, in _get_current_object 
    raise RuntimeError('no object bound to %s' % self.__name__) 
RuntimeError: no object bound to request 

有一些愚蠢的設置我失蹤?

回答

14

我認爲唯一的選擇是僅設置一個虛擬的請求,能夠爲測試創建的URI:

def test_returns_200_on_home_page(self): 
    // Set a dummy request just to be able to use uri_for(). 
    req = webapp2.Request.blank('/') 
    req.app = main.app 
    main.app.set_globals(app=main.app, request=req) 

    response = main.app.get_response(webapp2.uri_for('index')) 
    self.assertEqual(200, response.status_int) 

切勿使用set_globals()之外的測試。是由WSGI應用程序調用以線程安全方式設置活動應用程序和請求。

+0

感謝回覆@moraes。下班回家時我會試一試。順便說一下,我真的很喜歡webapp2,感謝與我們分享! – Aaron

+0

這似乎不是很好。現在我收到:文件「/Users/.../webapp2_example/lib/webapp2.py」,行1671,在uri_for 返回request.app.router.build(request,_name,args,kwargs) AttributeError:'NoneType '對象沒有屬性'路由器' – Aaron

+0

的確,並不那麼容易。我糾正了這個片段;希望現在可以運作。 – moraes

0

webapp2.uri_for()假定您處於Web請求上下文中,並且因爲找不到request對象而失敗。

與其解決此問題,您可以將您的應用程序視爲黑盒子,並使用文字URI來調用它,如您提及它的'/'。畢竟,你想模擬一個普通的Web請求,並且Web瀏覽器也將使用URI而不是內部路由快捷方式。

+0

我明白了你的觀點,但是,它違反了'DRY'主要原則,即將整個網址放在任何地方不止一次。如果網址發生變化,那麼更多的痛苦(而且容易出錯)要在任何地方改變它,而不是改變url路由聲明和正在完成 – Aaron

+0

實際上,https://webapp-improved.appspot.com/guide /routing.html#extended-routes指出DRY是改進webapp的動機之一,「避免應用程序代碼和模板中的硬編碼URI」 – Pat

相關問題