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