2013-07-09 62 views
7

我正在使用SQLAlchemy作爲ORM的金字塔應用程序。我想測試一個類方法的模型:在SQLAlchemy中使用factory_boy和類方法

# 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()在測試中,我得到一個錯誤:èUnboundExecutionError:找不到上映射器映射配置綁定|角色|角色,SQL表達式或本屆

我試過的Monkeypatching meta和更換,全球會議與我的會議,但後來我得到這個錯誤:èAttributeError的:對象類型「RoleFactory」有沒有屬性「find_all」

我打過電話RoleFactory.FACTORY_FOR.find_all()但後來我得到同樣的UnboundExecutionError。

我需要爲factory_boy做些別的事情才能知道類方法嗎?

回答

2

這可能太明顯了,但是你得到的是一個RoleFactory實例,當你需要一個Role實例時,工廠將不能訪問任何類方法,因爲它不是該類的子類。試着做這件事,看看會發生什麼:

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