[英]in a Flask unit-test, how can I mock objects on the request-global `g` object?
我有一个建立在一个数据库连接的烧瓶中应用before_filter
,非常类似于此 :
@app.before_request
def before_request():
g.db = connect_db()
现在:我正在编写一些单元测试,我不希望它们访问数据库。 我想用一个我可以设定期望的模拟对象替换g.db
我的测试是使用app.test_client()
足以证明烧瓶文档中的位置 。 一个示例测试看起来像
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'
test.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()
因此,这将打印出“我没有点击数据库”,而不是“我最终在实际功能内”。 显然,您需要根据实际使用情况调整模拟。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.