繁体   English   中英

单元测试基于rethinkdb的flask app,连接覆盖

[英]Unit testing rethinkdb based flask app, connections overriden

我正在为使用rethinkdb后端的烧瓶应用编写单元测试。 在每个请求之前和之后打开和关闭新连接,如下所示:

@app.before_request
def before_request():
    ARGS = settings.RETHINKDB_ARGS
    try:
        g.rdb_conn = rethinkdb.connect(host=ARGS['host'],
                               port=ARGS['port'],
                               db=ARGS['db'])
    except RqlDriverError:
        abort(503, "Database connection could be established.")

@app.teardown_request
def teardown_request(exception):
    try:
        g.rdb_conn.close()
    except AttributeError:
        pass

我正在为每个测试创建数据库记录

def setUp(self):
        self.app = current_app.test_client()
        self.user = User.create({
                                'email': 'a@a.com',
                                'first_name': 'a',
                                'last_name': 'a',
                                'role': 'user',
                                'status': 'active'


                           })

User.create基本上是在调用

r.table('user').insert(data).run(g.rdb_conn)

我的测试功能:

 def test_get(self):

        url = url_for('api.get_user', **{'id': self.user.data.id})
        retval = ujson.loads(self.app.get(url).data)
        ...
 def test_get2(self):
        ...

测试运行时,会发生以下情况:

  1. 设置第一次运行,比如g.rdb_conn = 1
  2. test_get run,g.rdb_conn被覆盖,g.rdb_conn = 2并在请求结束后关闭
  3. 使用g.rdb_conn = 2为test_get2第二次运行安装,但它已在上一个请求结束时关闭
  4. “ReqlDriverError:连接已关闭。” 抛出

如何在每次测试运行时阻止连接覆盖彼此?

显然,我的问题与rethinkdb没有直接关系,但是每次请求完成时都会被覆盖的flask全局变量被覆盖。

我用模拟库解决了它。

from mock import patch
...
rdb_conn = rethinkdb.connect(...)

class Test(unittest.TestCase):
...
    @patch('flask.g.rdb_conn', rdb_conn)
    def setUp(self):
        functions that depend on g.rdb_conn...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM