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

0 ответов

Другие вопросы по тегам