0

我有一个基于 java 的服务作为提供者,一个节点 JS 应用程序作为消费者。

我在这里使用了一个存根运行器https://github.com/spring-cloud-samples/stub-runner-boot让 Node JS 运行在 wiremock 上。但无论是 Node JS、浏览器还是 curl 作为客户端,我都会得到这个“光标”文本来代替从正则表达式元素生成的字符串。

这是合同:

request {
    method GET()
    url value(consumer(regex('/v2/accounts/[0-9]+')))
}

response {
    status 200
    headers {
        contentType(applicationJson())
    }
    body (
            "firstName": regex('[a-zA-Z]*'),
            "lastName": regex('[a-zA-Z]*'),
            "kycStatus": regex('FAILED|PASSED|PENDING|ERROR'),
            "address": [
                    "streetAddress" : "3244 jackson street",
                    "city" : "City",
                    "state" : regex('[a-zA-Z]{2}'),
                    "zipcode": regex('^\\d{5}\$')
            ]

    )
}

这是来自wiremock的实际响应:

响应:HTTP/1.1 200 内容类型:[application/json]

{
"firstName": {
    "cursor": 9
},
"lastName": {
    "cursor": 9
},
"kycStatus": {
    "cursor": 27
},
"address": {
    "streetAddress": "3244 jackson street",
    "city": "City",
    "state": {
        "cursor": 11
    },
    "zipcode": {
        "cursor": 7
    }
}

}

4

2 回答 2

1

我注意到您的光标值实际上是您的正则表达式中的字符数。所以这告诉我肯定有问题。我以前从未遇到过这种情况。

我认为你需要用 value() 包装你的正则表达式

request {
    method GET()
    url value(consumer(regex('/v2/accounts/[0-9]+')))
}

response {
    status 200
    headers {
        contentType(applicationJson())
    }
    body (
            "firstName": value(producer(regex('[a-zA-Z]*'))),
            "lastName": value(producer(regex('[a-zA-Z]*'))),
            "kycStatus": value(producer(regex('FAILED|PASSED|PENDING|ERROR'))),
            "address": [
                    "streetAddress" : "3244 jackson street",
                    "city" : "City",
                    "state" : value(producer(regex('[a-zA-Z]{2}'))),
                    "zipcode": value(producer(regex('^\\d{5}\$')))
            ]

    )
}
于 2018-01-26T04:09:52.197 回答
1

在生成wiremock存根时,我遇到了另一个以相同方式影响请求有效负载的示例。

如果我没有在请求正文中添加至少一个“字段”,例如:

request{
    // ...
    body (
            value(consumer(regex("[a-zA-Z0-9]+")), producer("derp"))
    )
}

请求有效负载必须是

{
    "cursor" : 12
}

正如在 target/META-INF/.../mappings/myContract.json 中生成的这个wiremock存根所见

"bodyPatterns" : [ {
  "equalToJson" : "{\"cursor\":12}",
  "ignoreArrayOrder" : false,
  "ignoreExtraElements" : false
} ]

解决方案

我需要做的就是在请求正文中添加至少一个字段

    body (
            aMadeUpField: value(consumer(regex("[a-zA-Z0-9]+")), producer("derp"))
    )

并且正则表达式现在将适用于该字段,正如我重新生成的wiremock存根所看到的那样

"bodyPatterns" : [ {
  "matchesJsonPath" : "$[?(@.['aMadeUpField'] =~ /[a-zA-Z0-9]+/)]"
} ]

这可能就是为什么文档中隐藏了一行说请求正文只支持 JSON 的原因

编辑:要检查的另一件事是“anyBoolean()”应更改为“aBoolean()”和“anInteger()”应更改为“anyInteger()”(我想 SCC 与命名真的不一致......)。我通过 ctrl + 将鼠标悬停在常规方法上并确保它们返回 DslProperty 或 ClientDslProperty 来仔细检查它们在 IntelliJ 中是否正确

而且,正如另一张海报所说,请务必使用 value() 包装任何 regex() 并在需要时使用 consumer() 和 producer() 。

于 2020-06-25T20:02:11.557 回答