如何在龙卷风中模拟get_current_user进行unittest?

时间:2014-10-12 08:01:49

标签: unit-testing mocking tornado

我有一个龙卷风网络应用程序。许多页面都需要有效的cookie才能访问。这使得无法测试这些处理程序。

我想使用mock库来模拟tornado.web.RequestHandler.get_current_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错误。因为我没有定义登录hanlder 。但是我希望模拟的get_current_user方法返回一个用户对象,所以在测试时不要去登录页面

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

1 个答案:

答案 0 :(得分:1)

如果@authenticated返回虚假值,get_current_user装饰器会重定向到登录页面。尝试返回非空字典。

您还在一个地方使用handlers.CreateSuperUserHandler,在另一个地方使用handlers.AdminArea.CreateSuperUserHandler;那些是同一类对象吗?