【发布时间】:2022-12-07 05:25:00
【问题描述】:
我想使用 rust proptest 库创建一个 JSON 策略。但是,我不想创建任意 JSON。我想根据模式(更具体地说,OpenAPI 模式)创建它。这意味着 JSON 的键是已知的,我不想使用任何策略创建它们,但我想使用该策略创建值(几乎是递归的)。
我已经实现了基本类型的策略,但我不知道如何创建 JSON 对象策略。
我希望策略具有类型 BoxedStratedy<serde_json::Value> 或能够将策略映射到此类型,因为 JSON 对象可以包含其他对象,因此我需要能够编写策略。
我找到了一个 HashMapStrategy 策略,但是,它只能由一个 hash_map 函数创建,该函数采用两种策略——一种用于生成键,一种用于生成值。我以为我可以对键使用 Just 策略,但它并没有导致任何地方。也许可以使用prop_filter_map。
Here 是代码。也有测试。一个通过,因为它只测试原始类型,另一个失败,因为我没有找到实现 generate_json_object 函数的方法。
我试过了,但类型不匹配。它不是从string映射到JSON值的策略,而是从string到BoxedStrategy的映射策略。
fn generate_json_object(object: &ObjectType) -> BoxedStrategy<serde_json::Value> {
let mut json_object = serde_json::Map::with_capacity(object.properties.len());
for (name, schema) in &object.properties {
let schema_kind = &schema.to_item_ref().schema_kind;
json_object.insert(name.clone(), schema_kind_to_json(schema_kind));
}
Just(serde_json::Value::Object(json_object)).boxed()
}
【问题讨论】:
标签: testing rust property-based-testing proptest