sqlalchemy事务不回滚

时间:2013-02-13 00:26:00

标签: python unit-testing sqlalchemy zope

对于我的集成测试,我自定义编写了unittest.TestCase的基类。

def initialize_sql(engine, dbsession):
    dbsession.configure(bind=engine)
    Base.metadata.bind = engine
    Base.metadata.drop_all(engine)  # ensure the database is clean!
    Base.metadata.create_all(engine)
    try:
        populate(dbsession)
    except IntegrityError:
        transaction.abort()

class HeavyTestBaseCase(unittest.TestCase):
    __TEST__ = False
    test_ini = 'test.ini'

    @classmethod
    def setUpClass(cls):
        TEST_ROOT = os.path.dirname(os.path.abspath(__file__))
        settings = appconfig('config:' + os.path.join(TEST_ROOT, cls.test_ini))
        cls.engine = engine_from_config(settings, prefix='sqlalchemy.')
        print 'Creating the tables on the test database %s' % cls.engine

        cls.dbsession = scoped_session(sessionmaker(
                extension=ZopeTransactionExtension()))
        config = Configurator(settings=settings)
        initialize_sql(cls.engine, cls.dbsession)

    def tearDown(self):
        transaction.abort() # strange name for rollback ...

    @classmethod
    def tearDownClass(cls):
        Base.metadata.drop_all(cls.engine)

现在是测试用例:

from mock import Mock, patch
from aurum.models import User
from aurum.user import register_user

class TestRegisterUserIntegration(HeavyTestBaseCase):
    __TEST__ = True

    @classmethod
    def setUpClass(cls):
        cls.uid = 'uid1234'
        cls.username = 'user01'
        cls.password = 'password01'
        cls.masteru = 'masteru'
        cls.masterp = 'masterp'

        cls.gcs_patcher = patch('aurum.user.GCS', autospec=True)
        cls.gcs = cls.gcs_patcher.start()
        cls.gcs.return_value.register.return_value = cls.uid
        super(TestRegisterUserIntegration, cls).setUpClass()

    def test_register_user01_successful_return_useid_and_shared_key(self):
        result = register_user(self.username, self.password, self.masteru, self.masterp)
        self.assertEqual(result.keys(), ['user_id', 'shared_key'])
        self.assertEqual(result['user_id'], self.uid)

    def test_register_user01_successful_write_to_database_query_is_not_none(self):
        register_user(self.username, self.password, self.masteru, self.masterp)
        result = self.dbsession.query(User).filter_by(username=self.username).first()
        self.assertTrue(result is not None)

但是回滚没有做任何事情。其中一个测试将因为重复键约束而失败,这意味着提交没有丢失。

在实际代码中,在返回之前我写了transaction.commit()来提交更改。

知道发生了什么事吗?感谢


改编@ zzzek的建议,这里是追溯: http://pastebin.com/K9fin7ZH

实际代码是这样的:

def add_user(dbsession, username, password):
    with transaction.manager:
        user = User(...)
        dbsession.add(user)

0 个答案:

没有答案