我正在使用Flask,pytest,SQLAlchemy和FactoryBoy(与pytest-factoryboy一起使用),并且希望每个测试都有一个独立的数据库。我将基于this blog post by Alex Michael的设置与this correction for defining a db_session()
fixture结合使用,该设置将在每次测试后回滚数据库。
这些示例之上的其他因素是使用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
是错误的,但我不知道应该是什么。或者也许是其他东西...?