微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在dict中使用Factory Boy在Django中创建数据模型工厂?或者,让FactoryBoy按需评估子工厂?

如何解决在dict中使用Factory Boy在Django中创建数据模型工厂?或者,让FactoryBoy按需评估子工厂?

我有以下ModelFactory:

class ProjectDataModelFactory(DjangoModelFactory):
    project = factory.SubFactory("projects.factories.ProjectModelFactory")
    version = "1"
    content = {
        "id": {"value": fuzzy.FuzzyText(length=7,chars=string.ascii_letters).fuzz().upper(),"type": "string"},"win_probability": {"value": fuzzy.FuzzyInteger(0,100).fuzz(),"type": "number"},"bid_value": {
            "value": fuzzy.FuzzyInteger(0,10000000).fuzz(),"type": "number",},"status": {"value": random.choice(["Won","Lost"]),"sector": {
            "value": random.choice(
                ["Construction","Technology","Finance","Consulting","Agriculture","Engineering"]
            ),"type": "string",} 

content["id"]中,我希望value成为project.external_id而不是fuzzy.FuzzyText(length=7,chars=string.ascii_letters).fuzz().upper(). external_idProjectModel.的一部分,但是当我将project.external_id放在模糊器的位置,会出现此错误

AttributeError:'SubFactory'对象没有属性'external_id

这似乎仅是字典问题。在其他情况下使用它时,我们没有遇到任何问题。

我没有太多使用FactoryBoy的经验,因此很容易变得微不足道。有什么想法吗?

解决方法

您遇到的第一个问题是:导入类后,将评估您在random字典中对.fuzz()content的所有调用:每个实例将使用完全相同的值。

为了执行延迟评估,必须将它们包装在factory_boy提供的声明中:

class ProjectDataModelFactory(DjangoModelFactory):
    project = factory.SubFactory("projects.factories.ProjectModelFactory")
    version = "1"
    content = factory.Dict(
        id=factory.Dict(
            value=fuzzy.FuzzyText(length=7,chars=string.ascii_uppercase),type="string",),win_probability=factory.Dict(
            value=fuzzy.FuzzyInteger(0,100),type="number",bid_value=factory.Dict(
            value=fuzzy.FuzzyInteger(0,10_000_000),status=factory.Dict(
            value=fuzzy.FuzzyChoice(["Won","Lost"]),sector=factory.Dict(
            value=fuzzy.FuzzyChoice(
                ["Construction","Technology","Finance","Consulting","Agriculture","Engineering"],)

factory.Dict(**kwargs)基本上是factory.SubFactory(DictFactory,**kwargs)的别名;然后,您可以像使用简单的SubFactory一样使用任何声明。

对于您的最初目标,现在可以轻松使用所有功能:

class ProjectDataModelFactory(DjangoModelFactory):
    project = factory.SubFactory("projects.factories.ProjectModelFactory")
    version = "1"
    content = factory.Dict(
        id=factory.Dict(
            # . is the {"value": x,"type": "string"} dict;
            # .. is {"id": {"value": x,...}} dict;
            # ... is the ProjectData(content={"id": {...}}) object.
            value=factory.SelfAttribute('...project.external_id'),# Other fields here
    )

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?