Factory Boy Build JSON 来自另一个工厂的字符串
Factory Boy Build JSON String from Another Factory
我正在尝试使用 Factory Boy 来为我的测试套件生成测试数据。我的数据由 JSON 对象和 body
字段组成,该字段包含转义的 JSON 字符串(下面的示例)。我还包括示例 python 数据类和此示例数据的 Factory Boy 工厂。
注意:对于这个例子,我跳过了使用 Faker 或内置模糊器设置假数据以简化问题。在更现实的用例中,eventtime
、deviceid
、enqueuedTime
等字段将包含随机值(使用固定种子来实现随机性)
我正在努力弄清楚如何生成内部 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 数据类和 Factory Boy 工厂:
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 字符串?
您可以使用Params
to declare the "structured" body, and a LazyAttribute
将其转换为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
不会传递给数据类构造函数。
然后通过将内容编码为 JSON 或任何其他用于将 Body
对象转换为 JSON.
的自定义方法来构建 body
字段
注意:我还使用 factory.SelfAttribute
将 event_type
从 BodyFactory
复制到 RootFactory
。
我正在尝试使用 Factory Boy 来为我的测试套件生成测试数据。我的数据由 JSON 对象和 body
字段组成,该字段包含转义的 JSON 字符串(下面的示例)。我还包括示例 python 数据类和此示例数据的 Factory Boy 工厂。
注意:对于这个例子,我跳过了使用 Faker 或内置模糊器设置假数据以简化问题。在更现实的用例中,eventtime
、deviceid
、enqueuedTime
等字段将包含随机值(使用固定种子来实现随机性)
我正在努力弄清楚如何生成内部 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 数据类和 Factory Boy 工厂:
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 字符串?
您可以使用Params
to declare the "structured" body, and a LazyAttribute
将其转换为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
不会传递给数据类构造函数。
然后通过将内容编码为 JSON 或任何其他用于将 Body
对象转换为 JSON.
body
字段
注意:我还使用 factory.SelfAttribute
将 event_type
从 BodyFactory
复制到 RootFactory
。