首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Flask测试API端点-测试

使用Flask测试API端点-测试
EN

Stack Overflow用户
提问于 2015-10-26 05:51:32
回答 1查看 718关注 0票数 1

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

代码语言:javascript
复制
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.commit()相同的潜在缺陷。

看起来将隔离级别设置为READ COMMITTED可能会起作用,但在flask-SQLAlchemy中如何做到这一点还不清楚。

EN

回答 1

Stack Overflow用户

发布于 2015-10-26 23:26:31

如果您使用的数据库支持事务,则可以改用db.session.flush()。您可以在测试设置和回滚上修补提交函数,或者在teardown上删除会话和取消修补。例如:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33335504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档