如何为我的测试使用模块级上下文管理器?

时间:2015-10-08 22:22:09

标签: python

我们的数据库连接代码包含在上下文管理器中。这很方便,你需要做的就是:

with db.transaction() as cursor:
    do_things_here()

它处理所有的嵌套和放大为您回滚错误的交易。

但是,它给我带来了一些小问题,因为我想要包装整个模块。我以为我可以这样做:

@pytest.fixture(scope='module')
def db():
    with db.transaction():
        yield db
        db.rollback()

但那不起作用 - pytest说我无法从夹具中屈服。

我们正在使用postgres& psycopg2引擎盖下。

有没有办法为整个模块使用上下文管理器,或者以其他方式解决我的问题?

我也尝试过这样的事情:

@pytest.fixture(scope='module')
def db(request):
    cursor = db.transaction()

    def teardown():
        cursor.__exit__(None, None, None)

    request.addfinalizer(teardown)

但是contextmanager装饰者不喜欢这样。

最后,我甚至试过

with db.transaction(force_rollback=True):
    def test_my_things():
         db.execute('CREATE TABLE castle_auuurrrhhgggg;')

但执行该操作失败,因为该表存在。

但是,如果我这样做:

def test_my_things():
    with db.transaction(force_rollback=True) as cursor:
         cursor.execute('CREATE TABLE knights_who_say_ni;')

它运作得很好。

关于如何在测试结束时回滚所有内容的任何想法?

1 个答案:

答案 0 :(得分:1)

如果您使用yieldfixture而不是常规fixture,则应该使用初始尝试。