2016-08-03 42 views
1

我是新來的單元測試使用的腳本。我試圖驗證與POST數據參數登錄,但是我得到的登錄頁面的響應,並登錄不上去的@tornado.web.authenticated in.Because沒有登錄我無法訪問其它功能,它響應到登錄頁面如何使用tornado.testing測試`@ authenticated`處理程序?

import tornado 
from tornado.testing import AsyncTestCase 
from tornado.web import Application, RequestHandler 
import app 
import urllib 

class MyTestCase(AsyncTestCase): 
    @tornado.testing.gen_test 
    def test_http_fetch_login(self): 
     data = urllib.urlencode(dict(username='admin', password='')) 
     client = AsyncHTTPClient(self.io_loop) 
     response = yield client.fetch("http://localhost:8888/console/login/?", method="POST",body=data) 
     # Test contents of response 
     self.assertIn("Automaton web console", response.body) 

    @tornado.testing.gen_test 
    def test_http_fetch_config(self): 
     client = AsyncHTTPClient(self.io_loop) 
     response = yield client.fetch("http://localhost:8888/console/configuration/?") 
     self.assertIn("server-version",response.body) 

回答

0

要測試使用@authenticated(除非你正在測試重定向到登錄頁面本身)的代碼,你需要傳遞將由您get_current_user方法接受一個cookie(或任何你正在使用的身份驗證的形式)。這樣做的細節將取決於你究竟是如何做你的認證有所不同,但如果你使用龍捲風的安全cookie,你可能會使用create_signed_value功能編碼的cookie。

0

從技術文檔:

如果裝飾後()與認證裝飾方法,用戶沒有登錄,服務器將發送403響應。所述@authenticated裝飾爲如果不是簡單地self.current_user簡寫:self.redirect(),可能不適合於非基於瀏覽器登錄方案。

所以,你可以使用mock做到像這樣的回答指出:如果你有secure_cookies=True應用PARAM https://stackoverflow.com/a/18286742/1090700

另一個403個狀態將在POST拋出調用。如果你想測試在非調試時尚代碼,您還可以使用模擬POST操作,同時保持secure_cookies=True應用參數,然後就嘲笑check_xsrf_cookie處理方法爲好,像這樣:

# Some previous stuff... 
    with mock.patch.object(YourSecuredHandler, 'get_secure_cookie') as mget: 
     mget.return_value = 'user_email' 
     response = self.fetch('/', method='GET')  
    with mock.patch.object(
      YourSecuredHandler, 'check_xsrf_cookie') as mpost: 
     mpost.return_value = None 
     response = self.fetch(
      url, method="POST", body=parse.urlencode(body1), 
      headers=headers) 
     self.assertEqual(response.code, 201) 
相關問題