Unit testing 如何在tornado中为unittest模拟获取当前用户?

Unit testing 如何在tornado中为unittest模拟获取当前用户?,unit-testing,mocking,tornado,Unit Testing,Mocking,Tornado,我有一个tornado web应用程序。许多页面需要有效的cookie才能访问。这使得测试这些处理程序变得不可能 我想使用mock库来模拟tornado.web.RequestHandler.get\u current\u user方法。但我就是做不对 我现在就是这样做的: class MyUT(tornado.testing.AsyncHTTPTestCase): def get_app(self): settings = { "template_path": '../

我有一个tornado web应用程序。许多页面需要有效的cookie才能访问。这使得测试这些处理程序变得不可能

我想使用
mock
库来模拟
tornado.web.RequestHandler.get\u current\u user
方法。但我就是做不对

我现在就是这样做的:

class MyUT(tornado.testing.AsyncHTTPTestCase):
  def get_app(self):
    settings = {
      "template_path": '../../../templates',
      "cookie_secret": 'secret',
      "login_url": '/admin/login',
      "debug": True
    }

    return Application([
      (r'/admin/create/super', handlers.CreateSuperUserHandler)
    ], **settings)


  def testGet(self):
    with mock.patch.object(handlers.CreateSuperUserHandler, 'get_current_user') as m:
      m.return_value = {}
      response = self.fetch('/admin/create/super')

    print(response.body)
    self.assertGreater(response.body.index('create'), 0)
如果我执行这段代码,我会得到一个404错误。因为我没有定义登录名。但是我希望mock
get\u current\u user
方法返回一个用户对象,所以测试时不要转到登录页面


我发现一件奇怪的事情是,如果我在
with
块中添加
m.assert_any_call()
,则不会出现断言错误。

如果
get_current_user
返回错误值,则
@authenticated
装饰程序将重定向到登录页面。尝试返回一个非空的dict


您还可以在一个位置使用
handlers.CreateSuperUserHandler
,在另一个位置使用
handlers.AdminArea.CreateSuperUserHandler
;这些是同一个类对象吗?

嗨,我不得不做同样的事情。尽管我(用补丁)模拟了get_current_user方法,但在类BaseHandler(tornado.web.RequestHandler)中,我仍然从路由接收403
@patch(“api.views.base.BaseHandler”)@gen\u test async def testGetUserNotFound(self,mget):mget.get\u current\u user.return\u value='test username'response=requests.get(f“{self.base\u url}/api/v5/users/123/devices”)