我知道在测试中默认禁用登录。我试图通过将 app.config['LOGIN_DISABLED']
设置为 False 来让它们重新打开。这似乎不起作用,因为 current_user
仍然返回 None
,但会在测试文件外部的代码中返回 User。
下面是一些相关的代码。我的 Flask 应用程序对象最初是在我的应用程序的主 __init__.py
中创建的,该对象在测试期间导入并重新配置。
==========
init.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
app = Flask(__name__)
app.config[u'DEBUG'] = settings.debug
db = SQLAlchemy(app)
login_manager = LoginManager()
login_manager.init_app(app)
==========
测试/base.py
from my_app import app, db
import unittest
class BaseTest(unittest.TestCase):
def setUp(self):
app.config['TESTING'] = True
app.config['LOGIN_DISABLED'] = False
#app.login_manager._login_disabled = False #doesn't help either
self.app = app.test_client()
db.create_all()
==========
测试/test_a.py
from flask_login import current_user
from my_app.tests.base import BaseTest
class MyTests(BaseTest):
def test_a(self):
#visit endpoint that calls `login_user(user)`
#printing `current_user` in that endpoint works, but the following line only returns `None`
print current_user
注意:用户绝对应该在打印语句之前登录。在端点中使用 current_user
可以按预期工作。
最佳答案
事实证明,我的问题是由于测试时没有使用相同的上下文,因此我的解决方案与描述的类似 here和 here 。 tests/test_a.py
现在看起来像:
from flask_login import current_user
from my_app.tests.base import BaseTest
class MyTests(BaseTest):
def test_a(self):
with self.app:
print current_user
奇怪的是,app.config['LOGIN_DISABLED'] = False
和 app.login_manager._login_disabled = False
在此更改后并不重要 - 两者都可以删除。
关于python - 让 Flask-Login 与 unittest 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52248925/