我一直在使用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.commit()相同的潜在缺陷。
看起来将隔离级别设置为READ COMMITTED可能会起作用,但在flask-SQLAlchemy中如何做到这一点还不清楚。
发布于 2015-10-26 23:26:31
如果您使用的数据库支持事务,则可以改用db.session.flush()。您可以在测试设置和回滚上修补提交函数,或者在teardown上删除会话和取消修补。例如:
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_commithttps://stackoverflow.com/questions/33335504
复制相似问题