我们的数据库连接代码包含在上下文管理器中。这很方便,你需要做的就是:
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;')
它运作得很好。
关于如何在测试结束时回滚所有内容的任何想法?