Сохранение экземпляров FactoryBoy в базе данных с помощью Flask, pytest и SQLAlchemy - PullRequest
0 голосов
/ 19 февраля 2019

Я использую Flask, pytest, SQLAlchemy и FactoryBoy (с pytest-factoryboy) и хотел бы, чтобы в каждом тесте была отдельная БД.Я основываю свою настройку на этой записи блога Алекса Майкла с этой поправкой для определения db_session() прибора , который откатывает БД после каждого теста.

Дополнительный фактор поверх этих примеров - использование FactoryBoy.Вещи работают, как и ожидалось, без него.Пример теста:

import pytest
from myapp.models import Company

@pytest.mark.usefixtures("db_session")
def test_company(db_session):
    c = Company(name="Megacorp")
    db_session.add(c)
    db_session.commit()

    c_from_db = Company.query.filter(name="Megacorp").first()

    assert c == c_from_db

Это сохраняет Company в БД и извлекает его.

Но если я создаю эту фабрику:

from factory import Sequence
from factory.alchemy import SQLAlchemyModelFactory
from myapp.models import Company
from myapp.models.shared import db

class CompanyFactory(SQLAlchemyModelFactory):
    name = Sequence(lambda n: "Company %d" % n)

    class Meta:
        model = Company
        sqlalchemy_session = db.session

И используйтечто в том же тесте вместо класса Company:

import pytest
from myapp.factories import CompanyFactory

@pytest.mark.usefixtures("db_session")
def test_company(db_session):
    c = CompanyFactory.create(name="Megacorp")
    db_session.commit()

    c_from_db = Company.query.filter(name="Megacorp").first()

    assert c == c_from_db

, тогда c_from_db равно None;это не спасает компанию в БД, и поэтому нечего извлекать.

Я догадываюсь , что фабричный sqlalchemy_session неверен, но я не знаю, чтоиначе так и должно быть.А может это что-то еще ...?

...