Использование factory_boy с SQLAlchemy и методами класса

Я работаю над приложением Pyramid с SQLAlchemy в качестве ORM. Я пытаюсь протестировать модель с помощью метода класса:

# 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: Не удалось найти привязку, настроенную для сопоставления Mapper|Роль|роль, выражение SQL или этот сеанс

Я попытался изменить meta обезьяны и заменить этот глобальный сеанс своим сеансом, но затем я получаю эту ошибку: E AttributeError: тип объекта «RoleFactory» не имеет атрибута «find_all»

Я пытался вызвать RoleFactory.FACTORY_FOR.find_all(), но потом получаю ту же ошибку UnboundExecutionError.

Нужно ли мне делать что-то еще, чтобы factory_boy знал о методе класса?


person pfctdayelise    schedule 09.07.2013    source источник


Ответы (1)


Это может быть слишком очевидно, но кажется, что у вас есть экземпляр RoleFactory, когда вам нужен экземпляр Role, фабрика не будет иметь доступа к каким-либо методам класса, поскольку она не является дочерним элементом класса. Попробуйте сделать это и посмотрите, что произойдет:

role = RoleFactory.build()
roles = role.find_all()
person Matthew Graves    schedule 17.07.2013