Изменения БД, сделанные в приборе, похоже, не сохраняются для тестирования - PullRequest
0 голосов
/ 05 октября 2019

Я пишу код Pytest с использованием sqlite db, чтобы проверить логику. Я установил прибор корневого уровня для создания экземпляра движка БД:

class SqliteEngine:
    def __init__(self):
        self._conn_engine = create_engine("sqlite://")
        self._conn_engine.execute("pragma foreign_keys=ON")

    def get_engine(self):
        return self._conn_engine

    def get_session(self):
        Session = sessionmaker(bind=self._conn_engine, autoflush=True)
        return Session()


@pytest.fixture(scope="session")
def sqlite_engine():
    sqlite_engine = SqliteEngine()
    return sqlite_engine

Затем в моем тестовом классе у меня есть

class TestRbac:
    @pytest.fixture(scope="class")
    def setup_rbac_tables(self, sqlite_engine):
        conn_engine = sqlite_engine.get_engine()
        conn_engine.execute("attach ':memory:' as rbac")
        Application.__table__.create(conn_engine)
        Client.__table__.create(conn_engine)
        Role.__table__.create(conn_engine)

        session = sqlite_engine.get_session()

        application = Application(id=1, name="test-application")
        session.add(application)
        session.flush()

        client = Client(id=0, name="Test", email_pattern="")
        session.add(client)
        session.flush()

Наконец, в тесте в этом классе я попытался

    def test_query_config_data_default(self, sqlite_engine, setup_rbac_tables, rbac):
        conn_engine = sqlite_engine.get_engine()
        session = sqlite_engine.get_session()

        client = Client(id=1, name=factory.Faker("name").generate(), email_pattern="")
        session.add(client)
        session.flush()

        clients = sqlite_engine.get_session().query(Client).all()
        for client in clients:
            print(client.id, client.name)

Тем не менее, только один клиент печатает (и если я пытаюсь Application, ни один не печатает), и я не могу понять, почему. Это проблема с областями приборов? Или двигатель? Или как sqlite работает в pytest?

1 Ответ

0 голосов
/ 06 октября 2019

Я не эксперт по этому вопросу, но я думаю, что вам нужно определить устройство таким образом, чтобы сеанс был общим, если вы не планируете фиксировать в каждом устройстве. В setup_rbac_tables сеанс уничтожается с помощью области действия функции. И когда снова вызывается get_session, создается новый сеанс.

В моих тестах sqlalchemy в pytest я делаю что-то вроде этого, где db fixture - это сеанс db, который повторно используется между приборами и в тесте:

@pytest.fixture
def customer_user(db):
    from ..model.user import User
    from ..model.auth import Group
    group = db.query(Group).filter(
        Group.name == 'customer').first()
    if not group:
        group = Group(name='customer', label='customer')
    user = User(email=test_email_fmt.format(uuid4().hex), group=group)
    db.add(user)
    return user
...