在Flask单元测试中,如何在request-global`g`对象上模拟对象? [英] in a Flask unit-test, how can I mock objects on the request-global `g` object?

查看:88
本文介绍了在Flask单元测试中,如何在request-global`g`对象上模拟对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个flask应用程序,它在before_filter中建立数据库连接,非常类似于

I have a flask application that is setting up a database connection in a before_filter, very similar to this:

@app.before_request
def before_request():
    g.db = connect_db()

现在:我正在编写一些单元测试,我希望它们进入数据库.我想用可以设置期望值的模拟对象替换g.db.

Now: I am writing some unit-tests and I do not want them to hit the database. I want to replace g.db with a mock object that I can set expectations on.

我的测试使用的是app.test_client(),如烧瓶文档此处所示.测试示例看起来像

My tests are using app.test_client(), as is demonstrated in the flask documentation here. An example test looks something like

def test(self):
    response = app.test_client().post('/endpoint', data={..})
    self.assertEqual(response.status_code, 200)
    ...

测试可以通过,但是它们正在访问数据库,正如我所说的,我想用模拟对象代替数据库访问.我看不到test_client中的任何方式来访问g对象或更改before_filters.

The tests work and pass, but they are hitting the database and as I said I want to replace db access with mock objects. I do not see any way in test_client to access the g object or alter the 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()

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

So this will print out 'I did not hit the db', rather than 'I ended up inside the actual function'. Obviously you'll need to adapt the mocks to your actual use case.

这篇关于在Flask单元测试中,如何在request-global`g`对象上模拟对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆