2012-06-07 74 views
2

我想用AsyncHTTPTestCase來測試龍捲風。我想測試用@ tornado.web.authenticated註解標記的處理程序。由於這種處理需要身份驗證,我們必須首先登錄或以某種方式在思考我們正在驗證我們的測試代碼龍捲風測試@ tornado.web.authenticated

class HandlerToTest(BaseHandler): 
    @tornado.web.authenticated 
    def get(self): 
    self.render("hello.html", user=self.get_current_user()) 

根據this article我們可以捏造的cookie欺騙它。我有這個工作,但根據本達內爾龍捲風維護者這不建議。 Ben建議使用CookieLib模塊,但需要我們沒有的響應的'info'部分。

另一個blog post suggests mocking get_current_user()調用使用mox。但是我無法在博客中獲得示例代碼。

所以我的問題是: 測試標記爲認證的處理程序的最佳方式是什麼?有人可以指點我的示例應用程序嗎?

回答

3

最終得到了Mocks的工作。不知道這是否是'最好的方式',但它可能對未來某個人有用。這段代碼測試2個處理器和嘲笑get_current_user()呼叫通過@tornado.web.authenticated產生:

# encoding: utf-8 
import os, os.path, sys 
import tornado.web 
import tornado.testing 
import mox 

class BaseHandler(tornado.web.RequestHandler): 
    def get_login_url(self): 
     return u"/login" 

    def get_current_user(self): 
     user_json = self.get_secure_cookie("user") 
     if user_json: 
      return tornado.escape.json_decode(user_json) 
     else: 
      return None 

class HelloHandler(BaseHandler): 
    @tornado.web.authenticated 
    def get(self): 
     self.render("protected.html") 


class Protected(tornado.web.RequestHandler): 
    def get_current_user(self): 
     # get an user from somewhere 
     return "andy" 

    @tornado.web.authenticated 
    def get(self): 
     self.render("protected.html") 


class TestAuthenticatedHandlers(tornado.testing.AsyncHTTPTestCase): 
    def get_app(self): 
     self.mox = mox.Mox() 
     app = tornado.web.Application([ 
      (r'/protected', Protected), 
      (r'/hello', HelloHandler) 
     ]) 
     return app 

    def tearDown(self): 
     self.mox.UnsetStubs() 
     self.mox.ResetAll() 

    def test_new_admin(self): 
     self.mox.StubOutWithMock(Protected, 'get_current_user', use_mock_anything=True) 
     Protected.get_current_user().AndReturn("test_user") 
     self.mox.ReplayAll() 
     resp = self.fetch('/protected') 
     self.assertEqual(resp.code, 200) 
     self.mox.VerifyAll() 

    def test_hello_page(self): 
     self.mox.StubOutWithMock(HelloHandler, 'get_current_user', use_mock_anything=True) 
     HelloHandler.get_current_user().AndReturn("test_user") 
     self.mox.ReplayAll() 
     resp = self.fetch('/hello') 
     self.assertEqual(resp.code, 200) 
     self.assertIn("Hello", resp.body) 
     self.mox.VerifyAll() 
-2

在我而言只是工作:

BaseHandler.get_current_user = lambda x: {'username': 'user', 'email': '[email protected]'} 
+0

或者添加更多的細節來解釋它如何解決這個問題。 –

+0

我的意思是BaseHandler方法get_current_user可以用AsyncHTTPTestCase之外的任何函數覆蓋。在其他方面龍捲風認證裝飾只是檢查self.current_user的值 –