При тестировании моего приложения Pyramid с помощью WebTest я не смог создать/использовать отдельный сеанс в своих тестах без получения предупреждений об уже существующем сеансе с ограниченной областью действия.
Вот функция main() приложения Pyramid, где настраивается база данных.
# __init__.py of Pyramid application
from pyramid_sqlalchemy import init_sqlalchemy
from sqlalchemy import create_engine
def main(global_config, **settings):
...
db_url = 'some-url'
engine = create_engine(db_url)
init_sqlalchemy(engine) # Warning thrown here.
Вот тестовый код.
# test.py (Functional tests)
import transaction
from unittest import TestCase
from pyramid.paster import get_appsettings
from pyramid_sqlalchemy import init_sqlalchemy, Session
from sqlalchemy import create_engine
from webtest import TestApp
from app import main
from app.models.users import User
class BaseTestCase(TestCase):
def base_set_up(self):
# Create app using WebTest
settings = get_appsettings('test.ini', name='main')
app = main({}, **settings)
self.test_app = TestApp(app)
# Create session for tests.
db_url = 'same-url-as-above'
engine = create_engine(db_url)
init_sqlalchemy(engine)
# Note: I've tried both using pyramid_sqlalchemy approach here and
# creating a "plain, old" SQLAlchemy session here using sessionmaker.
def base_tear_down(self):
Session.remove()
class MyTests(BaseTestCase):
def setUp(self):
self.base_set_up()
with transaction.manager:
self.user = User('[email protected]', 'John', 'Smith')
Session.add(self.user)
Session.flush()
Session.expunge_all()
...
def tearDown(self):
self.base_tear_down()
def test_1(self):
# This is a typical workflow on my tests.
response = self.test_app.patch_json('/users/{0}'.format(self.user.id), {'email': '[email protected]')
self.assertEqual(response.status_code, 200)
user = Session.query(User).filter_by(id=self.user.id).first()
self.assertEqual(user.email, '[email protected]')
...
def test_8(self):
...
Запуск тестов дает мне 8 пройденных, 7 предупреждений, где каждый тест, кроме первого, дает следующее предупреждение:
Из приложения Pyramid:
__init__.py -> main -> init_sqlalchemy(engine)
: sqlalchemy.exc.SAWarning: По крайней мере один сеанс с заданной областью уже присутствует. configure() не может влиять на уже созданные сеансы.
Если это имеет какое-либо значение, я полагаю, что вижу здесь ту же проблему, за исключением того, что я использую пирамиду_sqlalchemy, а не создаю свою собственную DBSession.
Session.expire_all()
для очистки состояния по мере необходимости. - person latetojoin   schedule 30.08.2018