[英]How to mock `current_user` in flask templates?
我想在模板渲染下模擬flask-login
的current_user
。 此函數返回當前登錄的用戶。
現在我正在使用flask-login
AnnonymousUserMixin
,如果用戶未經過身份驗證,則默認返回。 但這導致各種各樣的玩雜耍。 如果我可以簡單地模擬current_user
我就可以創建一個Mocked對象來返回它。
這是我今天使用的樣本:
import unnittest
from flask_login.mixins import AnonymousUserMixin
class TestFoo(unittest.TestCase):
@patch.object(AnonymousUserMixin, 'is_admin', create=True,
return_value=False)
@patch.object(AnonymousUserMixin, 'is_authenticated', return_value=True)
def test_user_restriction(self, *args):
...
問候,
好的。 我找到了答案。
flask-login
將要求您使用login_manager.init_app(your_app)
初始化LoginManager
實例。 執行此操作時,將current_user
添加到應用程序上下文處理器。 這發生在flask_login.utils._user_context_processor
函數中,該函數定義為
def _user_context_processor():
return dict(current_user=_get_user())
這里_get_user
是在同一個模塊中定義的。 我要做的嘲笑current_user
是模擬_get_user
在flask_login.utils
。
這是一個如何完成它的工作示例。 我正在打印響應內容,以便人們可以看到結果不同。 真正的測試不會手動實例化Test類,應該使用unittest.main
或者適當的東西。
from flask import Flask, render_template_string as render_string
from flask_login import LoginManager, UserMixin
app = Flask(__name__)
loginmgr = LoginManager(app)
loginmgr.init_app(app)
class User(UserMixin):
pass
@loginmgr.user_loader
def load_user(user_id):
return User.get(user_id)
@app.route('/')
def index():
return render_string('Hello, {{ current_user | safe }}')
if __name__ == '__main__':
import unittest
from unittest import mock
class Test:
def test(self):
client = app.test_client()
response = client.get('/')
data = response.data.decode('utf-8')
print(data)
@mock.patch('flask_login.utils._get_user')
def test_current_user(self, current_user):
user = mock.MagicMock()
user.__repr__ = lambda self: 'Mr Mocked'
current_user.return_value = user
client = app.test_client()
response = client.get('/')
data = response.data.decode('utf-8')
print(data)
t = Test()
t.test()
t.test_current_user()
這是它的輸出:
Hello, <flask_login.mixins.AnonymousUserMixin object at 0x7f9d5ddaaf60>
Hello, Mr Mocked
問候,
我在“測試 ”一節中發現這個教程很有趣。
它說:
需要在請求的上下文中訪問current_user(它是一個線程本地對象,就像flask.request一樣)。 當self.client.post完成請求並且每個線程局部對象都被拆除時。 我們需要保留請求上下文,以便我們可以測試與Flask-Login的集成。 幸運的是,Flask的test_client是一個上下文管理器,這意味着我們可以在一個語句中使用它,只要我們需要它就會保持上下文:
因此,簡單來說,您可以通過post請求登錄您的用戶, current_user
對象將可用,然后您可以在代碼中測試您想要的所有內容。
這是一個例子:
with self.client:
response = self.client.post(url_for('users.login'),
data={'email': 'joe@joes.com', 'password': '12345'})
self.assert_redirects(response, url_for('index'))
self.assertTrue(current_user.name == 'Joe')
self.assertFalse(current_user.is_anonymous())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.