我使用pytest作为测试我的应用程序的框架,我也想使用pytest factoryboy。因此,我的conftest.py看起来非常像例子:
import factory
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from model import model
engine = create_engine('sqlite://')
session = scoped_session(sessionmaker(bind=engine))
# Create tables
model.Base.metadata.create_all(engine)
class ExampleFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = model.ExampleClass
sqlalchemy_session = session
label = factory.Sequence(lambda n: u'object_%d' % n)
我有这样的多个工厂。问题是,当我以这种方式使用工厂时,每次单元测试都不会拆除会话。我基本上使用一个大会话来进行我所进行的大量单元测试。不是很理想。使用灯具我可以在每个单元测试中刷新会话。有没有办法使用factoryboy pytest来做到这一点?
答案 0 :(得分:0)
刚刚尝试了一个找到here的解决方案,它可以很好地完成工作而不会太复杂或太脏:将每个工厂包装到一个夹具中,该夹具具有另一个功能范围的session
夹具。
这对你来说可能是这样的:
@pytest.fixture
def session():
session = <session creation>
yield session
session.rollback()
session.close()
@pytest.fixture
def exemple_factory(session):
class ExampleFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = model.ExampleClass
sqlalchemy_session = session
label = factory.Sequence(lambda n: u'object_%d' % n)
return ExampleFactory