Factory Boy从另一个工厂构建JSON字符串

2024-10-03 11:21:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用Factory Boy为我的测试套件生成测试数据。我的数据由包含转义JSON字符串的body字段的JSON对象组成(下面的示例)。我还为这个示例数据提供了示例python数据类和工厂男孩工厂

注意:在这个例子中,为了简化问题,我跳过了使用Faker或内置模糊器设置假数据的过程。在更现实的用例中,像eventtimedeviceidenqueuedTime这样的字段将包含rondomized值(使用固定的随机种子)

我正在努力找出如何生成内部JSON对象并使用Factory Boy将其字符串化

示例数据点:

{
    "body": "{\"eventdata\":{\"count\":\"1\",\"sourceid\":\"0\",\"updatetime\":\"1579797993879\",\"description\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit\"},\"eventtime\":\"2020-01-23T16:46:35.522Z\",\"eventversion\":\"1.0.0\",\"eventtype\":\"FooEventType\",\"deviceid\":\"000000123ABC\"}",
    "partition": "30",
    "enqueuedTime": "2020-01-23T16:46:35.594Z",
    "event_type": "FooEventType",
    "year": 2020,
    "month": 1,
    "day": 23}

我的Python数据类和工厂男孩工厂:

from dataclasses import dataclass
import factory

@dataclass
class Root:
  body: str
  partition: str
  enqueued_time: str
  event_type: str
  year: int
  month: int
  day: int

@dataclass
class Eventdata:
  count: str
  sourceid: str
  updatetime: str
  description: str

@dataclass
class Body:
  eventdata: Eventdata
  eventtime: str
  eventversion: str
  eventtype: str
  deviceid: str

class EventdataFactory(factory.Factory):
  class Meta:
    model = Eventdata
  count = "1"
  sourceid = "0"
  updatetime = "1579797993879"
  description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit"

class BodyFactory(factory.Factory):
  class Meta:
    model = Body
  eventdata = factory.SubFactory(Eventdata)
  eventtime = "2020-01-23T16:46:35.522Z"
  eventversion = "1.0.0"
  eventtype = "FooEventType" # Note: It is the same in Root
  deviceid = "000000123ABC"

class RootFactory(factory.Factory):
  class Meta:
    model = Root
  body = "Escaped JSON String" # Need help here
  partition = "30"
  enqueuedTime = "2020-01-23T16:46:35.594Z"
  event_type = "FooEventType" # Note: It is the same in Body
  year = 2020
  month = 1
  day = 23

如何从“BodyFactory”为“RootFactory”中的body字段创建转义JSON字符串生成


Tags: 数据字符串json示例factory工厂bodyclass
1条回答
网友
1楼 · 发布于 2024-10-03 11:21:09

您可以使用^{}声明“结构化”主体,使用^{}将其转换为JSON:

class RootFactory(factory.Factory):
    class Meta:
        model = Root

    class Params:
        body_raw = factory.SubFactory(BodyFactory)

    partition = 30
    enqueuedTime = "2020-01-23T16:46:35.594Z"

    # Copy Body.event_type to Root.event_type
    event_type = factory.SelfAttribute('.body_raw.event_type')

    # Convert `body_raw` to JSON
    body = factory.LazyAttribute(lambda o: json.dumps(o.body_raw))

在这个模型中,原始的“Body”对象被构建为SubFactory(在class Params)对象,但仅在工厂求值期间可用:body_raw不会被传递给数据类构造函数。 然后body字段通过将内容编码为JSON或任何其他用于将Body对象转换为JSON的自定义方法来构建

注意:我还使用了^{}event_typeBodyFactory复制到RootFactory

相关问题 更多 >