我刚遇到了testuite的问题。 我正在使用带有nosetests的设置,SQLAlchemy,Flask和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))
(是的,我使用的是正常的工厂而不是他的SQLAlchemy工厂,因为这也不起作用)
为什么我的工厂对象不存储到db?它不会引发错误,它只是不保存。 我的意思是即使当前事务还没有提交,查询以后应该查询实际的事务,不是吗?
奇怪的是,当我手动提交会话时,它会引发错误。
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))
知道为什么这不起作用?
感谢您的想法
答案 0 :(得分:2)
您可以在不设置SQLAlchemy会话的情况下定义factory_boy工厂,然后在初始化Flask应用程序和通过分配工厂类的_meta
属性使用工厂之间进行设置:
db_session = set_up_a_db_session_somehow()
MyFactoryClass._meta.sqlalchemy_session = db_session
这似乎适用于作用域会话。
答案 1 :(得分:1)
好的,我现在看到我的一个错误。我创建了一个范围的会话。相反,我应该为我的应用程序使用正常会话。这里的问题是 - 我如何懒惰初始化会话?
我将在另一个问题中解决这个问题
对于作用域会话,我找到了这个特定问题的答案。 问题是,通过作用域会话,我的整个应用程序都无法正常工作,但测试将会......
对于此问题,此代码适用于作用域会话。
def _create_fixtures(self):
db.begin()
self.user = UserFactory()
db.add(self.user)
db.commit()