4

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

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

根据这篇文章,我们可以捏造饼干。我已经完成了这项工作,但根据 Ben Darnell 龙卷风维护者的说法,不建议这样做。Ben 建议使用CookieLib模块,但这需要我们没有的响应的“信息”部分。

一篇博文建议使用mox 模拟get_current_user() 调用。但是我无法让博客中的示例代码正常工作。

所以我的问题是:测试标记为已验证的处理程序的最佳方法是什么?有人可以指点我一个示例应用程序吗?

4

3 回答 3

4

最终让 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()
于 2012-06-07T18:14:55.510 回答
0

这个 Torando utils 库还允许您测试经过身份验证的处理程序:tornado_utils/http_test_client.py

于 2012-11-22T14:57:57.893 回答
-2

就我而言,它很简单:

BaseHandler.get_current_user = lambda x: {'username': 'user', 'email': 'user@ex.com'}
于 2014-03-28T06:40:20.737 回答