为什么这个被弃用的Factory.set_creation_function的替代品不能与nosetests一起使用?

Pat*_*ick 11 python sqlalchemy nose flask flask-sqlalchemy

Factory Boy弃用了set_creation_function(参见ChangeLog 2.6.1)并建议开发人员

使用SomeFactory的_create()方法的替换替换factory.set_creation_function(SomeFactory,creation_function)

我有i)一些衍生工厂类和ii)我的数据库会话在另一个模块中实例化,所以我尝试用下面的第二个代码块替换https://github.com/mattupstate/overholt中的工作示例.PyCharm警告我"db"导入没有被使用,所以我怀疑在设置sqlalchemy_session时可能没有正确解除引用?

使用nosetests 1.3.7(但现在不推荐使用FactoryBoy的set_creation_function):

from myapp.core import db

def create_sqlalchemy_model_function(class_to_create, *args, **kwargs):
    entity = class_to_create(**kwargs)
    db.session.add(entity)
    db.session.commit()
    return entity

Factory.set_creation_function(create_sqlalchemy_model_function)
Run Code Online (Sandbox Code Playgroud)

不使用nosetests 2.x(看起来db没有被正确引用?)

from factory.alchemy import SQLAlchemyModelFactory as Factory
from myapp.core import db

class Factory():
    class Meta:
        sqlalchemy_session = db.session

    def _create(cls, model_class, *args, **kwargs):
        entity = model_class(*args, **kwargs)
        db.session.add(entity)
        db.session.commit()
        return entity
Run Code Online (Sandbox Code Playgroud)

ale*_*cxe 5

样本无法工作代码的两个主要问题:

  • 该类应该来自SQLAlchemyModelFactory
  • _create()方法应定义为classmethod

固定版本:

from factory.alchemy import SQLAlchemyModelFactory as Factory
from myapp.core import db

class MyFactory(Factory):
    class Meta:
        sqlalchemy_session = db.session

    @classmethod
    def _create(cls, model_class, *args, **kwargs):
        entity = model_class(*args, **kwargs)
        db.session.add(entity)
        db.session.commit()
        return entity
Run Code Online (Sandbox Code Playgroud)

这里还有一个模型工厂的示例,它覆盖了该_create()方法.