“hasExactly”关键字在 WireMock JSON 存根配置中如何工作?

问题描述 投票:0回答:1

我有一个 JSON 存根配置,如下 -

   {
  "mappings": [
    {
      "request": {
        "method": "GET",
        "url": "/student",
        "headers": {
          "X-Request-ID": {
            "hasExactly": [
              {
                "equalTo": "Demo1"
              },
              {
                "contains": "Demo2"
              },
              {
                "doesNotContain": "Demo3"
              }
            ]
          }
        }
      },
      "response": {
        "status": 200,
        "headers": {
          "Content-Type": "application/json"
        },
        "jsonBody": {
          "studentId": 1
        }
      }
    }
  ]
}

在邮递员中,我正在创建如下请求,它正在给出响应。

根据我的理解,X-Request-ID 应该恰好具有三个值,如果一个值等于“Demo1”,则不应评估剩余两个值的条件。其他值和条件也是如此。

第一个值 = Demo1 -> 满足“equalTo”:“Demo1”(接下来的 2 个不应检查此条件)
第二个值 = Demo2 -> 满足“包含”:“Demo2”
第三个值 = Demo3 -> 这里我们只剩下一个条件,即“doesNotContain”:“Demo3”,并且第三个值不满足它。

但它似乎只检查三个值,但如果它找到匹配的两个条件的相同值。

wiremock wiremock-standalone
1个回答
0
投票

hasExactly
数组中对象的位置不是位置性的,这意味着仅仅因为对象位于第一个位置,它不仅会检查第一个标头。

这会导致匹配发生(您希望它不会发生),因为正在进行以下检查:

  • 有三个
    X-Request-ID
    标题 (✅)
  • 其中一个
    X-Request-ID
    标题满足
    "equalTo": "Demo1"
    (✅ - 第一个标题)
  • 其中一个
    X-Request-ID
    标题满足
    "contains": "Demo2"
    (✅ - 第二个标题)
  • 其中一个
    X-Request-ID
    标头满足
    "doesNotContain": "Demo3"
    (✅ - 第一个和第二个标头)

您可以通过更简单的映射来证明此行为:

{
    "request": {
        "method": "GET",
        "url": "/foo",
        "headers": {
            "X-Request-ID": {
                "hasExactly": [
                    { "equalTo": "1"},
                    { "contains": "1"}
                ]
            }
        }
    },
    "response": {
        "status": 200
    }
}

并发送带有以下

X-Request-ID
标头的请求:
X-Request-ID: 1
X-Request-ID: 2

不幸的是,我不确定是否有现成的解决方案可以满足您的要求。我建议考虑实现一个 Custom Matcher 来处理这个逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.