我正在学习如何使用Mock在Python中测试函数。我正在尝试为一个简单的函数编写测试,
@social.route('/friends', methods=['GET', 'POST'])
def friends():
test_val = session.get('uid')
if test_val is None:
return redirect(url_for('social.index'))
else:
return render_template("/home.html")
但是,我仍然坚持如何尝试模拟session.get(' uid')值。到目前为止,这是我的尝试,
@patch('session', return_value='')
@patch('flask.templating._render', return_value='')
def test_mocked_render(self, mocked, mock_session):
print "mocked", repr(self.app.get('/social/friends').data)
print "was _render called?", mocked.called
这种尝试可能完全错误,这绝对是错误的方式,因为我仍然无法模拟会话。但是,有人可以通过这个正确的方式指导我吗?感谢。
答案 0 :(得分:1)
从Flask 0.8开始,我们提供了一个所谓的“会话事务”,它模拟在测试客户端上下文中打开会话的相应调用并对其进行修改。
让我们举一个简单的例子:app.py
from flask import Flask, session
app = Flask(__name__)
app.secret_key = 'very secret'
@app.route('/friends', methods=['GET', 'POST'])
def friends():
test_val = session.get('uid')
if test_val is None:
return 'uid not in session'
else:
return 'uid in session'
if __name__ == '__main__':
app.run(debug=True)
测试文件:test_app.py
import unittest
from app import app
class TestSession(unittest.TestCase):
def test_mocked_session(self):
with app.test_client() as c:
with c.session_transaction() as sess:
sess['uid'] = 'Bar'
# once this is reached the session was stored
rv = c.get('/friends')
assert rv.data == 'uid in session'
if __name__ == '__main__':
unittest.main()
通过python test_app.py
运行测试。