一尘不染

测试Flask登录和身份验证?

flask

我正在开发Flask应用程序,并使用Flask-security进行用户身份验证(反过来又在下面使用Flask-login)。

我有一条需要身份验证的路由/user。我正在尝试编写一个单元测试,该测试对经过身份验证的用户返回适当的响应。

在单元测试中,我正在创建一个用户并以该用户身份登录,如下所示:

from unittest import TestCase
from app import app, db
from models import User
from flask_security.utils import login_user

class UserTest(TestCase):
   def setUp(self):
       self.app = app
       self.client = self.app.test_client()
       self._ctx = self.app.test_request_context()
       self._ctx.push()

       db.create_all()

   def tearDown(self):
       if self._ctx is not None:
           self._ctx.pop()

       db.session.remove()
       db.drop_all()

   def test_user_authentication():
       # (the test case is within a test request context)
       user = User(active=True)
       db.session.add(user)
       db.session.commit()
       login_user(user)

       # current_user here is the user
       print(current_user)

       # current_user within this request is an anonymous user
       r = test_client.get('/user')

在测试内current_user返回正确的用户。但是,请求的视图始终返回AnonymousUsercurrent_user

所述/user路线定义为:

class CurrentUser(Resource):
    def get(self):
        return current_user  # returns an AnonymousUser

我可以肯定我只是不完全了解测试Flask请求上下文如何工作。我已经阅读了很多Flask Request Context文档,但是仍然不了解如何进行此特定的单元测试。


阅读 1169

收藏
2020-04-06

共1个答案

一尘不染

问题在于该test_client.get()调用导致要推送一个新的请求上下文,因此你在setUp()测试用例方法中推送的那个不是/user处理程序看到的那个。

我认为文档的“ 登录和注销”和“ 测试添加消息”部分中显示的方法是测试登录的最佳方法。想法是像普通客户端一样通过应用程序发送登录请求。这将有助于在测试客户端的用户会话中注册登录的用户。

2020-04-06