управление сессиями factoryboy pytest

Я использую pytest в качестве основы для тестирования своего приложения, и я также хочу использовать pytest factoryboy. На данный момент мой conftest.py выглядит почти так же, как в примере:

import factory
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from model import model

engine = create_engine('sqlite://')
session = scoped_session(sessionmaker(bind=engine))

# Create tables
model.Base.metadata.create_all(engine)

class ExampleFactory(factory.alchemy.SQLAlchemyModelFactory):

    class Meta:
        model = model.ExampleClass
        sqlalchemy_session = session

    label = factory.Sequence(lambda n: u'object_%d' % n)

У меня несколько таких заводов. Проблема в том, что когда я использую фабрики таким образом, сеанс не будет разрываться при каждом модульном тесте. Я в основном использую один большой сеанс для множества модульных тестов, которые у меня есть. Не очень идеально. Используя фикстуры, я мог обновлять сеанс при каждом модульном тесте. Есть ли способ сделать это с помощью factoryboy pytest?


person hasdrubal    schedule 07.11.2017    source источник


Ответы (1)


Только что попробовал решение, найденное здесь, которое выполняет эту работу. довольно хорошо, не будучи слишком сложным или грязным: обернуть каждую фабрику в фикстуру, которая предоставляется с другой фикстурой session с функциональной областью.

Для вас это может выглядеть так:

@pytest.fixture
def session():
    session = <session creation>
    yield session
    session.rollback()
    session.close()

@pytest.fixture
def exemple_factory(session):
    class ExampleFactory(factory.alchemy.SQLAlchemyModelFactory):

        class Meta:
            model = model.ExampleClass
            sqlalchemy_session = session

        label = factory.Sequence(lambda n: u'object_%d' % n)

    return ExampleFactory
person Tryph    schedule 27.01.2018