我有一个建立在一个数据库连接的烧瓶中的应用程序before_filter,非常类似于此:
before_filter
@app.before_request def before_request(): g.db = connect_db()
现在:我正在编写一些单元测试,但我不希望它们影响数据库。我想替换g.db为可以设置期望值的模拟对象。
g.db
我的测试中使用app.test_client(),足以证明烧瓶文档中的位置。测试示例看起来像
app.test_client()
def test(self): response = app.test_client().post('/endpoint', data={..}) self.assertEqual(response.status_code, 200) ...
这些测试可以通过,但是可以访问数据库,正如我所说,我想用模拟对象代替db访问。我看不到任何test_client访问g对象或更改before_filters的方法。
test_client
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()
因此,这将打印出“我没有命中数据库”,而不是“我最终进入了实际功能”。显然,你需要使模拟适应你的实际用例。