gpt4 book ai didi

python - 将 factory_boy 与 SQLAlchemy 和类方法一起使用

转载 作者:太空狗 更新时间:2023-10-29 21:53:15 25 4
gpt4 key购买 nike

我正在使用 SQLAlchemy 作为 ORM 开发 Pyramid 应用程序。我正在尝试使用类方法测试模型:

# this is essentially a global used by all the models
Session = scoped_session(sessionmaker(autocommit=False))

class Role(Base):
__tablename__ = 'role'

id = sa.Column(sa.types.Integer, primary_key=True)
name = sa.Column(sa.types.Text, unique=True, nullable=False)

def __init__(self, **kwargs):
super(Role, self).__init__(**kwargs)

@classmethod
def find_all(self):
return Session.query(Role).order_by(Role.name).all()

我正在使用 factory_boy进行测试,这是我尝试建立测试工厂的方式:

import factory
from factory.alchemy import SQLAlchemyModelFactory
from sqlalchemy.orm import scoped_session, sessionmaker
from zk.model.meta import Base
from zk.model.role import Role

session = scoped_session(sessionmaker())
engine = create_engine('sqlite://')
session.configure(bind=engine)
Base.metadata.create_all(engine)

class RoleFactory(SQLAlchemyModelFactory):
FACTORY_FOR = Role
FACTORY_SESSION = session

但是,当我尝试在测试中调用 RoleFactory.find_all() 时,出现错误:E UnboundExecutionError: Could not locate a bind configured on mapper Mapper|Role|role, SQL 表达式或本 session

我尝试使用 monkeypatching meta 并用我的 session 替换该全局 session ,但随后出现此错误:E AttributeError: type object 'RoleFactory' has no attribute 'find_all'

我尝试调用 RoleFactory.FACTORY_FOR.find_all() 但随后我得到了相同的 UnboundExecutionError。

我是否需要为 factory_boy 做一些其他事情来了解类方法?

最佳答案

这可能太明显了,但看起来你得到的是一个 RoleFactory 实例,当你需要一个 Role 实例时,工厂将无法访问任何类方法,因为它不是类的子类。尝试这样做,看看会发生什么:

role = RoleFactory.build()
roles = role.find_all()

关于python - 将 factory_boy 与 SQLAlchemy 和类方法一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17540943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com