我创建了一个delete_entity
删除实体的函数,并且我有一个测试这个函数的函数。
#__init__.py
engine = create_engine('sqlite://:memory')
Session = scoped_session(sessionmaker(engine))
# entity.py
def delete_entity(id, commit=False):
""" Delete entity and return amount of amount of rows affected. """
rows_affected = Session.query(Entity).filter(Entity.id == id).delete()
if commit:
Session.commit()
# Marker @A
return rows_affected
# test_entity.py
def test_delete_entity(Session):
# ... Here I add 2 Entity objects. Database now contains 2 rows.
assert delete_entity(1) == 1 # Not committed, row stays in database.
assert delete_entity(1, commmit=True) # Row should be deleted
# marker @B
assert len(Session.query(Entity).all()) == 1
test_delete_entity()
当我单独运行时,此测试通过。但是当我将此测试与其他测试一起运行时,此测试失败。它失败了assert len(Session.query(Entity)).all()) == 1
。该查询找到 2 行,因此该行看起来没有被删除。但是,当我在 @A 上使用 Python 调试器 ( pytest.set_trace()
) 并查询数据库中的所有 Entity 对象时,我找到了 1 行。所以删除查询成功了,一行被删除了。但是当我在@BI 上查询所有实体行时,得到 2 行。
如何“同步”两个会话,以便我的测试通过?