使用Flask-Testing

时间:2015-10-25 21:51:32

标签: python sqlalchemy flask-sqlalchemy flask-testing

我一直在使用Flask-Testing来测试我的API,但我最近遇到了一些问题。我通常要做的是验证端点是否按预期更新了我的数据库。为此,我在点击结束点之前验证数据库值,然后点击端点,然后验证值是否已更新,如下所示:

def test_some_end_point(self):
    # make sure the item doesn't exist yet.
    with pytest.raises(NoResultFound):
        db.session.query(MyDBItem)\
                .filter_by(name='blah').one()
    db.session.commit()
    # now make sure it's created, the right status code is returned,
    # and it has correct data.
    path = "my/path/to/endpoint"
    post_data = {'term': 'blah', 'other_data': 'meh'}
    response = self.post_data_and_get_result(
        path, post_data)
    assert response.status_code == 204
    item = db.session.query(MyDBItem)\
        .filter_by(name='blah').one()
    assert item.usages == 1

这很有效,但我的问题是它只有在我们清除db.session.commit()来电之间的会话时才有效。这感觉好像在惹麻烦,因为其他程序员中的一个很有可能忘记在某些时候包含它。最重要的是,不必要的承诺会导致测试速度减慢。有没有合理的方法来强制查询中的数据刷新?像db.session.query(MyDBItem, refresh=True)这样的东西?或者其他一些通常不那么容易出错的方法呢?

我已经尝试了session.refresh()session.expire_all(),并且两者都没有一直有效,并且两者都有与session.com()

相同的潜在陷阱

将隔离级别设置为READ COMMITTED似乎可以解决问题,但是如何在flask-SQLAlchemy中执行此操作尚不清楚。

1 个答案:

答案 0 :(得分:0)

如果您使用的数据库支持事务,则可以使用db.session.flush()代替。您可以在测试设置和回滚时修补提交功能,或者删除会话并在拆卸时取消。例如:

from flask.ext.testing import TestCase

class BaseTestCase(TestCase):
    def create_app(self):
        pass

    def setUp(self):
        self.orig_commit = db.session.commit
        db.session.commit = db.session.flush

    def tearDown(self):
        db.session.remove()
        db.session.commit = self.orig_commit