【问题标题】:How to create JSON object strategy according to a schema with rust proptest?如何使用 rust proptest 根据模式创建 JSON 对象策略?
【发布时间】: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值的策略,而是从stringBoxedStrategy的映射策略。

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


    【解决方案1】:

    可以创建一个策略向量,它实现了 Strategy 特征并且可以装箱。所以要创建一个serde_json::Value::Object,我们创建一个元组向量。第一个元素将是 Just 键,第二个元素将是价值的盒装策略。价值的盒装策略可以通过schema_kind_to_json函数创建。在我们有一个实现 Strategy 的元组向量之后,我们可以使用 .prop_map 将其转换为 serde_json::Value::Object

    fn generate_json_object(object: &ObjectType) -> BoxedStrategy<serde_json::Value> {
        let mut vec = Vec::with_capacity(object.properties.len());
        for (name, schema) in &object.properties {
            let schema_kind = &schema.to_item_ref().schema_kind;
            vec.push((Just(name.clone()), schema_kind_to_json(schema_kind)));
        }
        vec.prop_map(|vec| serde_json::Value::Object(serde_json::Map::from_iter(vec)))
            .boxed()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-16
      • 2014-08-06
      • 2021-04-13
      • 2021-01-02
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多