Сохранение экземпляров FactoryBoy в базе данных с помощью Flask, pytest и SQLAlchemy
Я использую 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
это неправильно, но я не знаю, что еще это должно быть. Или, может быть, это что-то еще...?