Hi On Jan 23, 2008 4:07 PM, Michael Bayer <[EMAIL PROTECTED]> wrote: > your teardown code can't have any dependencies on the test code > itself. So at the very least start the teardown phase with > "PrivateSession.close()" so that you start fresh.
I tried adding that to the teardown code but then this assertion fails: assert so in fixture_session and if I comment out the assertion, I get the same ConcurrentModificationError without a stored reference to the object that was saved, I'm not sure how to delete it [without monkeying with last inserted id]. > > the two ways to create tests that use isolated data are to either > create and drop tables local to the unit tests themselves, or to run > the unit tests within an enclosing Transaction (as in, conn = > engine.connect(); trans = conn.begin(); session.bind=conn) which is > rolled back at the end of the unit tests. The SQLA unit tests > themselves use the former method but I have applied the latter method > to Pylons tests (and is also what you usually do with Java/Hibernate > unit tests). ok, I think I see what you're saying. Removing the PrivateSession.close(), I tried implementing begin/rollback by changing the app segment to: conn = engine.connect() AppSession.configure(bind=conn) app_session = AppSession() trans = conn.begin() so2 = SomeObject() so2.keyname = "some unique key name" app_session.save(so2) try: app_session.flush() except IntegrityError: # violated unique key trans.rollback() else: trans.commit() app_session.close() ...but it still fails with the same error, Deleted rowcount 0 does not match number of objects deleted 1. What am I missing? I don't understand how the teardown code is dependent on the app code if it is using a different session and a different connection (now) to save the same mapped class instances. Here is the altered test case: from sqlalchemy import * from sqlalchemy.orm import scoped_session, sessionmaker, mapper from sqlalchemy.exceptions import IntegrityError PrivateSession = scoped_session( sessionmaker(autoflush=False, transactional=True), scopefunc=lambda:__name__) # a private scope AppSession = scoped_session( sessionmaker(autoflush=False, transactional=True)) dsn = 'sqlite:///:memory:' def test_sa_scoping(): engine = create_engine(dsn) metadata = MetaData() sometable = Table('sometable', metadata, Column('id', Integer, primary_key=True), Column('keyname', String(30), unique=True)) class SomeObject(object): pass metadata.create_all(bind=engine) PrivateSession.configure(bind=engine) mapper(SomeObject, sometable) fixture_session = PrivateSession() # create some data to test with : so = SomeObject() so.keyname = "some unique key name" fixture_session.save(so) fixture_session.flush() conn = engine.connect() AppSession.configure(bind=conn) app_session = AppSession() trans = conn.begin() so2 = SomeObject() so2.keyname = "some unique key name" app_session.save(so2) try: app_session.flush() except IntegrityError: # violated unique key trans.rollback() else: trans.commit() app_session.close() # after testing application code, I want to tear down # test even if the app had an error : assert so in fixture_session fixture_session.delete(so) fixture_session.flush() rs = fixture_session.query(SomeObject).all() assert rs == [], "unexpected: %s" % rs if __name__ == '__main__': test_sa_scoping() same exception... sqlalchemy.exceptions.ConcurrentModificationError: Deleted rowcount 0 does not match number of objects deleted 1 --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---