我正在尝试学习烧瓶技术堆栈,对于我的应用程序,我正在使用 Flask-SQLAlchemy。一切都很完美,但我正在努力编写集成测试。我不想使用 SQLite,因为在生产中我使用的是 PostgreSQL,并且放置大量模拟实际上会更多地测试我自己的实现而不是逻辑本身。
因此,经过一些研究,我决定实施将数据写入测试数据库的测试,并在每次测试后回滚更改(为了性能起见)。实际上,我正在尝试实现类似于这种方法的东西: http: //sontek.net/blog/detail/writing-tests-for-pyramid-and-sqlalchemy。
我的问题是创建正确的事务并能够回滚它。这是我的基类的代码:
from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class MyAppIntegrationTestCase(unittest.TestCase):
@classmethod
def setUpClass(cls):
app.config['TESTING'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2:///db_test'
init_app()
db.app = app
db.create_all(app=app)
@classmethod
def tearDownClass(cls):
db.drop_all(app=app)
def setUp(self):
db.session.rollback()
self.trans = db.session.begin(subtransactions=True)
def tearDown(self):
self.trans.rollback()
当我尝试执行测试时,出现以下错误:
Traceback (most recent call last):
File "myapp/src/core/tests/__init__.py", line 53, in tearDown
self.trans.rollback()
File "myapp/venv/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 370, in rollback
self._assert_active(prepared_ok=True, rollback_ok=True)
File "myapp/venv/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 203, in _assert_active
raise sa_exc.ResourceClosedError(closed_msg)
ResourceClosedError: This transaction is closed
我敢打赌这是 scoped_session 的问题,当我运行测试时,它会为所有测试重用一个全局会话,但我对 SQLAlchemy 的了解还不够深入。
任何帮助将不胜感激!谢谢!