[英]Disabling @login_required while unit-testing flask with flask-login
[英]unit testing flask app with login_required
我的烧瓶应用程序设置有以下测试用例
class AboutViewTest(BaseTestCase):
def setUp(self):
self.url = url_for('pages_app.about',_external=True)
self.url_login_redirect = url_for('accounts_app.login')
def test_render(self):
# without login
resp = self.client.get(self.url)
self.assertRedirects(resp, self.url_login_redirect)
# after login
with self.app.test_client() as c:
login_successful = self.login(username='user1', password="123456", client=c)
self.assertTrue(login_successful)
resp = c.get(self.url)
self.assertStatus(resp, 200) # this fails
使用@login_required测试视图
@pages_app.route('/about/')
@login_required
def about():
return render_template('pages/about.html')
def login_required(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if g.user is None:
return redirect(url_for('accounts_app.login', next=request.url))
return f(*args, **kwargs)
return decorated_function
第二个测试用例失败(需要登录),因为它被重定向到登录302 != 200
如何测试此视图以传递两种情况(使用和不使用登录)? 这是最好的做法吗?
最好的方法可能是按照Flask文档中的建议填充g.user
变量:
def get_user():
user = getattr(g, 'user', None)
if user is None:
user = fetch_current_user_from_database()
g.user = user
return user
显然,你必须定义fetch_current_user_from_database()
,你将实例化一个用户(我假设你有一个User
类)并返回它。 然后只需调用get_user()
即可让用户在需要时立即登录。
作为替代方案,您可以在设置中添加标志以禁用登录,并在测试时在login_required
方法中使用它。
例如:
from flask import current_app
def login_required(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if not current_app.config.get('LOGIN_DISABLED', False) and g.user is None:
return redirect(url_for('accounts_app.login', next=request.url))
return f(*args, **kwargs)
return decorated_function
然后在你的测试中:
def test_render(self):
# without login
resp = self.client.get(self.url)
self.assertRedirects(resp, self.url_login_redirect)
self.app.config['LOGIN_DISABLED'] = True
resp = c.get(self.url)
self.assertStatus(resp, 200)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.