为什么这个替代已弃用的Factory.set_creation_function的方法在使用nosetests时无法工作?

11

Factory Boy弃用了set_creation_function方法(详见ChangeLog 2.6.1),建议开发人员将factory.set_creation_function(SomeFactory, creation_function)替换为重写SomeFactory类的_create()方法。

我有i)许多派生工厂类和ii)我的db会话在另一个模块中实例化,因此我尝试使用下面的第二个代码块替换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)

无法与nosetests 2.x一起工作(看起来数据库引用不正确?)

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
1个回答

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接