我有一个带有POST端点的Flask应用程序,我想测试它。端点执行一些数据库重置,在这种特殊情况下,我试图断言用一组特定数据调用端点并不会改变数据库。
我的数据库模型有一个pytest
夹具,一个在数据库事务中运行测试的autouse=True
夹具,以及一个生成Flask test_client
的夹具:
@pytest.fixture()
def myfixture():
return MyModel.create(...)
@pytest.fixture
def testapp():
app.config['TESTING'] = True
with app.app_context():
yield app.test_client()
@pytest.fixture(autouse=True)
def with_database_txn():
with db.atomic() as txn:
yield
txn.rollback()
这适用于大多数测试。但是,当我测试调用我的端点时,我的数据库记录出现了一个奇怪的问题:
def test_endpoint(myfixture, testapp):
assert MyModel.select().count() == 1
r = app.test_client().post('/endpoint', headers={...}, data=json.dumps({...}))
assert r.status_code == 200
assert r.data.decode() == 'no changes'
assert MyModel.select().count() == 1
我的测试在最终assert
上失败,声称MyModel.select().count
已成为0
。记录在请求返回之前仍然存在,我已在/endpoint
的处理程序中验证过。
我假设(猜测,甚至)pytest
&#39}的灯具,peewee
的交易和flask
&之间存在一些奇怪的互动#39; s请求上下文导致事务在第二个断言被触发之前被回滚,但我无法找到有关可能发生的事情的任何信息。
在peewee
级别查看DEBUG
的日志并不提供任何有关插入灯具和选择记录的信息,但有趣的是它也没有&#39} ; t显示与交易有关的任何事情,我确信它曾经......吸烟枪或者只是改变了最近的版本?
无论哪种方式,任何帮助追踪正在发生的事情都将非常感激!
答案 0 :(得分:0)
最后结果证明这是我的错误 - 数据库在我的代码深处的另一个调用中被关闭了。对不起,噪音!