7

私は ORM として SQLAlchemy を使用して 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: マッパーで構成されたバインドが見つかりませんでした。

metaモンキーパッチを適用して、そのグローバル セッションを自分のセッションに置き換えようとしましたが、次のエラーが発生しました: E AttributeError: type object 'RoleFactory' has no attribute 'find_all'

呼び出してみRoleFactory.FACTORY_FOR.find_all()ましたが、同じ UnboundExecutionError が発生します。

factory_boy がクラスメソッドについて知るために何か他のことをする必要がありますか?

4

1 に答える 1

4

これはあまりにも明白かもしれませんが、RoleFactory インスタンスが必要な場合、ファクトリはクラスの子ではないため、どのクラスメソッドにもアクセスできません。これを実行して、何が起こるか見てみましょう:

role = RoleFactory.build()
roles = role.find_all()
于 2013-07-17T06:56:45.703 に答える