gpt4 book ai didi

python - Tornado 测试@tornado.web.authenticated

转载 作者:太空宇宙 更新时间:2023-11-04 06:22:36 27 4
gpt4 key购买 nike

我正在尝试使用 AsyncHTTPTestCase 测试 Tornado .我想测试标有 @tornado.web.authenticated 注释的处理程序。因为此处理程序需要身份验证,所以我们必须先登录或以某种方式欺骗它以为我们在测试代码中已通过身份验证

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

根据 this article我们可以捏造 cookies 。我有这个工作,但根据 Ben Darnell tornado 维护者的说法,不推荐这样做。 Ben 建议使用 CookieLib模块,但这需要我们没有的响应的“信息”部分。

另一个blog post suggests mocking使用 mox 的 get_current_user() 调用.但是我无法使博客中的示例代码正常工作。

所以我的问题是:测试标记为已验证的处理程序的最佳方法是什么?谁能给我指出一个示例应用程序?

最佳答案

最终让模拟工作。不知道这是否是“最佳方式”,但将来可能对某人有用。此代码测试 2 个处理程序并模拟 @tornado.web.authenticated 生成的 get_current_user() 调用:

# 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()

关于python - Tornado 测试@tornado.web.authenticated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10936978/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com