我有一个 Flask 应用程序,它在 before_filter
中设置数据库连接,非常类似于 this :
@app.before_request
def before_request():
g.db = connect_db()
现在:我正在编写一些单元测试,我不希望它们访问数据库。我想将 g.db
替换为我可以设置期望值的模拟对象。
我的测试使用的是 app.test_client()
,正如 flask 文档中所展示的那样 here .示例测试看起来像
def test(self):
response = app.test_client().post('/endpoint', data={..})
self.assertEqual(response.status_code, 200)
...
测试有效并通过,但它们正在访问数据库,正如我所说,我想用模拟对象替换数据库访问。我在 test_client
中看不到任何访问 g
对象或更改 before_filters 的方法。
最佳答案
这行得通
test_app.py
from flask import Flask, g
app = Flask(__name__)
def connect_db():
print 'I ended up inside the actual function'
return object()
@app.before_request
def before_request():
g.db = connect_db()
@app.route('/')
def root():
return 'Hello, World'
测试.py
from mock import patch
import unittest
from test_app import app
def not_a_db_hit():
print 'I did not hit the db'
class FlaskTest(unittest.TestCase):
@patch('test_app.connect_db')
def test_root(self, mock_connect_db):
mock_connect_db.side_effect = not_a_db_hit
response = app.test_client().get('/')
self.assertEqual(response.status_code, 200)
if __name__ == '__main__':
unittest.main()
所以这将打印出“我没有命中数据库”,而不是“我最终进入了实际函数”。显然,您需要根据实际用例调整模拟。
关于python - 在 Flask 单元测试中,如何模拟请求全局 `g` 对象上的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14131494/