在Flask单元测试中,如何在request-global`g`对象上模拟对象?

我有一个建立在一个数据库连接的烧瓶中的应用程序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)

...

这些测试可以通过,但是可以访问数据库,正如我所说,我想用模拟对象代替db访问。我看不到任何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()

因此,这将打印出“我没有命中数据库”,而不是“我最终进入了实际功能”。显然,你需要使模拟适应你的实际用例。

以上是 在Flask单元测试中,如何在request-global`g`对象上模拟对象? 的全部内容, 来源链接: utcz.com/qa/409062.html

回到顶部