如何使用tornado.testing测试`@ authenticated`处理程序?

时间:2016-08-03 13:01:55

标签: python unit-testing web-applications tornado

我是使用脚本进行单元测试的新手。我试图在post数据中使用参数验证登录,但我得到登录页面作为响应而没有登录。因为@tornado.web.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)

2 个答案:

答案 0 :(得分:0)

要测试使用@authenticated的代码(除非您正在测试重定向到登录页面本身),您需要传递一个cookie(或您正在使用的任何形式的身份验证),这将被您接受get_current_user方法。具体细节取决于您进行身份验证的具体程度,但如果您使用Tornado的安全cookie,则可能会使用create_signed_value函数对cookie进行编码。

答案 1 :(得分:0)

来自文档:

  

如果使用经过身份验证的装饰器修饰post()方法,并且用户未登录,则服务器将发送403响应。 @authenticated装饰器只是简写,如果不是self.current_user:self.redirect(),可能不适合非基于浏览器的登录方案。

所以你可以使用mock这样的答案:https://stackoverflow.com/a/18286742/1090700

如果你有secure_cookies=True app param,则会在POST调用中抛出另一个403状态。如果要以非调试方式测试代码,您还可以在保留secure_cookies=True应用程序参数的同时使用模拟POST操作,然后仅将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)