我一直在使用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中执行此操作尚不清楚。
答案 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