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()
) を使用し、データベース内のすべてのエンティティ オブジェクトに対してクエリを実行すると、1 行が見つかります。したがって、削除クエリは成功し、1 行が削除されました。しかし、@BI ですべてのエンティティ行を照会すると、2 行が取得されます。
両方のセッションを「同期」して、テストに合格するにはどうすればよいですか?