问题描述
简介
我正在尝试在表中植入数据以进行测试。为此,我使用了工厂男孩包。
我已经建立了一个处理种子的工厂类。
isChecked
问题
在测试中,我运行以下代码来创建订单。
class OrderItemFactory(factory.alchemy.sqlAlchemyModelFactory):
id = factory.Sequence(lambda n: n)
orders = factory.SubFactory(
'testsuite.database.factories.OrderFactory.OrderFactory')
items = factory.SubFactory(
'testsuite.database.factories.ItemFactory.ItemFactory')
class Meta:
model = OrderItem
sqlalchemy_session_persistence = 'commit'
但是,如果我要手动创建一行,一切正常。
# create order
order = OrderFactory.create()
item = session.query(Item).\
filter(Item.id == 1).\
first()
orderItem = OrderItemFactory.create(
orders=order,items=item
)
解决方法
我认为问题来自您使用的 SQLAlchemy 会话。
使用SQLAlchemy,每个对象都属于一个“会话”;默认情况下, factory_boy 在创建对象时将使用新会话;您必须在 Factory.Meta
参数中设置 sqlalchemy_session
:
# Import the `session` value from the place you're defining it for your project
from myproject.db import session
class OrderItemFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = OrderItem
sqlalchemy_session_persistence = 'commit'
sqlaclhemy_session = session
通常,项目会为这些设置定义它们的工厂子类:
# project/testing.py
import factory
from . import db
class BaseFactory(factory.alchemy.SQLAlchemyFactory):
class Meta:
abstract = True
sqlalchemy_session = db.session
sqlalchemy_session_persistence = 'commit'
# project/orders/factories.py
import factory
from . import models
from project import testing
class OrderItemFactory(testing.BaseFactory):
class Meta:
model = models.OrderItem
# sqlalchemy_session_* will be imported through the use of BaseFactory
,
如果您使用的是flask_sqlalchemy,那么您应该检查您是否插入了正确的字段,而不是数据库关系。