我们的数据库连接代码包装在上下文管理器中。它很方便,因为您所要做的就是:
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;')
效果很好。
关于如何在测试结束时回滚所有内容,有什么想法吗?
最佳答案
如果您使用 yieldfixture
它应该可以与您的初次尝试配合使用,而不是常规的装置
。
关于python - 如何使用模块级上下文管理器进行测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33026914/