1

我创建了一个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 行。

如何“同步”两个会话,以便我的测试通过?

4

1 回答 1

0

我刚刚尝试过,但无法重现您的问题。这是我的完整脚本和结果:

import sqlalchemy as sa

from sqlalchemy import create_engine, Column, Integer, Unicode
from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy.ext.declarative import declarative_base


engine = create_engine('sqlite://', echo=True)

Base = declarative_base(bind=engine)
Session = scoped_session(sessionmaker(bind=engine))


class Entity(Base):
    __tablename__ = 'test_table'
    id = Column(Integer(), primary_key=True)
    name = Column(Unicode(200))


Base.metadata.create_all()

e1 = Entity()
e1.name = 'first row'
e2 = Entity()
e2.name = 'second row'

Session.add_all([e1, e2])
Session.commit()

print len(Session.query(Entity).all())
# CORRECTLY prints 2

rows_affected = Session.query(Entity).filter(Entity.id == 1).delete()
print rows_affected
# CORRECTLY prints 1
Session.commit()

print len(Session.query(Entity).all())
# CORRECTLY prints 1

由于您的脚本不可运行,我们无法找到您的问题。

请像我一样提供显示整个问题的可运行脚本。脚本必须完成所有的导入、插入数据、删除和查询。否则我无法在我的环境中重现它。

于 2013-11-15T11:08:47.930 回答