2014-04-05 28 views
1

我剛碰到我的測試套件出現問題。 我使用的是安裝有nosetests,SQLAlchemy的,瓶和工廠男孩如何正確使用SQLAlchemy會話(Lazy Loaded)的Factory Boy?

我有以下代碼:以下

def _create_fixtures(self): 
    self.user = UserFactory() 
    pprint(db.query(User).all()) 
    db.add(self.user) 
    pprint(db.query(User).all()) 

女巫回報:

[<User #1>, <User #2>] 
[<User #1>, <User #2>] 

我UserFactory看起來是這樣的:

class UserFactory(Factory): 
    FACTORY_FOR = User 
    FACTORY_SESSION = db 
    email = Sequence(lambda n: 'user{0}@wohnortfinder.com'.format(n)) 
    password = "password" 
    username = Sequence(lambda n: 'user{0}'.format(n)) 

(是的,我使用正常的工廠,而不是他SQLAlche我的工廠,因此也沒有工作)

爲什麼不是我的工廠對象存儲到分貝?它不會引發錯誤,它不會保存。 我的意思是,即使當前事務還沒有提交,稍後查詢應查詢實際事務,不應該嗎?

奇怪的是,當我手動提交會話時,會產生錯誤。

InvalidRequestError: No transaction is begun. 

儘管我在創建會話對象時開始了一個事務。

def init_engine(uri, **kwargs): 
    global engine 
    engine = create_engine(uri, **kwargs) 
    Base.metadata.create_all(engine) 
    db.begin() 
    return engine 


engine = None 

db = scoped_session(lambda: create_session(bind=engine)) 

爲什麼這是行不通的任何想法?

感謝您的想法

回答

1

好吧我現在看到我的一個錯誤。我創建一個範圍會話。相反,我應該爲我的應用程序使用正常會話。這裏的問題是 - 我如何懶惰初始化一個正常的會話?

我會在另一個問題

爲範圍的會議上,我找到了答案,這個具體問題線程這個問題。 事情是,與範圍會話我的整個應用程序將無法正常工作,但測試將..

此代碼適用於此問題的範圍會話。

def _create_fixtures(self): 
    db.begin() 
    self.user = UserFactory() 
    db.add(self.user) 
    db.commit() 
2

您可以定義factory_boy工廠沒有設置SQLAlchemy的會話,然後將其設置在初始化的瓶的應用程序,並使用工廠之間通過分配到工廠類的_meta屬性:

db_session = set_up_a_db_session_somehow() 
MyFactoryClass._meta.sqlalchemy_session = db_session 

這似乎與範圍會話正常工作。

+0

''set_up_a_db_session_somehow()'這是一個甜美的函數名稱:) – Nick

相關問題