我是使用脚本进行单元测试的新手。我试图在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)
答案 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)