2013-07-09 34 views
7

Tôi đang làm việc trên ứng dụng Kim tự tháp với SQLAlchemy làm ORM. Tôi cố gắng để thử nghiệm một mô hình với một phương pháp học:Sử dụng factory_boy với phương thức SQLAlchemy và lớp học

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

Tôi đang sử dụng factory_boy để thử nghiệm và đây là làm thế nào Tôi cố gắng để thiết lập nhà máy thử nghiệm của tôi:

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 

Tuy nhiên khi tôi cố gắng để gọi RoleFactory.find_all() trong một thử nghiệm, tôi nhận được một lỗi: E UnboundExecutionError: không thể xác định vị trí một ràng buộc cấu hình trên mapper Mapper | Role | vai trò, biểu thức SQL hoặc Session này

tôi đã cố gắng monkeypatching meta và thay thế mà phiên toàn cầu với phiên tôi, nhưng sau đó tôi nhận được lỗi này: E AttributeError: loại đối tượng 'RoleFactory' không có thuộc tính 'find_all'

tôi đã cố gắng gọi RoleFactory.FACTORY_FOR.find_all() nhưng sau đó tôi nhận được cùng một UnboundExecutionError.

Tôi có cần phải làm điều gì đó khác để factory_boy biết về phương pháp lớp không?

Trả lời

2

Điều này có thể quá rõ ràng, nhưng có vẻ như những gì bạn đã có là một cá thể RoleFactory, khi bạn cần một cá thể Role, nhà máy sẽ không có quyền truy cập vào bất kỳ classmethods vì nó không phải là con của lớp. Hãy thử thực hiện việc này và xem điều gì sẽ xảy ra:

role = RoleFactory.build() 
roles = role.find_all() 
Các vấn đề liên quan