2013-07-09 7 views
7

Ich arbeite an einer Pyramid-App mit SQLAlchemy als ORM. Ich versuche, ein Modell mit einer Klassenmethode zu testen:Verwendung von factory_boy mit SQLAlchemy und Klassenmethoden

# 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() 

ich factory_boy bin mit zu testen und hier ist, wie ich versuche, meinen Test Fabrik einzurichten:

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 

aber wenn ich versuche, RoleFactory.find_all() in einem Test zu nennen, erhalte ich eine Fehlermeldung: E UnboundExecutionError: Könnte eine bindung konfiguriert Mapper Mapper nicht finden | Rolle | Rolle, SQL-Ausdruck oder diese Session

Iversucht monkeypatchingund dass die globale Session mit meiner Sitzung zu ersetzen, aber dann bekomme ich diesen Fehler: E Attribute: Typ Objekt ‚RoleFactory‘ hat kein Attribut ‚find_all‘

ich RoleFactory.FACTORY_FOR.find_all() Aufruf versucht, aber dann bekomme ich die gleiche UnboundExecutionError.

Muss ich etwas anderes für factory_boy tun, um etwas über die Klassenmethode zu erfahren?

Antwort

2

Dies ist vielleicht zu offensichtlich, aber es scheint, dass Sie eine RoleFactory-Instanz haben. Wenn Sie eine Role-Instanz benötigen, hat die Factory keinen Zugriff auf Klassenmethoden, da sie kein Kind der Klasse ist. Versuchen Sie dies zu tun und zu sehen, was passiert:

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