使用peewee事务和pytest测试Flask端点

时间:2018-01-11 17:23:56

标签: python postgresql flask pytest peewee

我有一个带有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显示与交易有关的任何事情,我确信它曾经......吸烟枪或者只是改变了最近的版本?

无论哪种方式,任何帮助追踪正在发生的事情都将非常感激!

1 个答案:

答案 0 :(得分:0)

最后结果证明这是我的错误 - 数据库在我的代码深处的另一个调用中被关闭了。对不起,噪音!