Pact body 匹配 - 匹配节点数
Pact body matching - match number of nodes
我尝试实现以下目标:
我想验证正文 ("entry") 中的特定节点是否具有最小和最大数量的直接子节点,称为 "content"(1 到 10 个节点)。我不关心这些子节点里有什么,有什么值,有多少个子节点。
因为我是新手,不知道怎么匹配这样的东西,希望有人能帮助我。
提前致谢。
编辑 1:
我使用我的一位同事构建的节点匹配器,如下所示:
return builder.given("given").uponReceiving("description").path(SERVICEPATH)
.query(query).method(METHOD_GET).headers(ACCEPT, REQ_ACCEPT).willRespondWith().status(200)
.matchHeader(HEADER_CONTENT_TYPE, RESP_HEADER_CONTENT_TYPE_REGEX).body(responseBody)
.matchBody(new PactDslXmlNodeMatcher().node("entry").node("content").value(".*")).toPact();
不要让这激怒你,.matchBody
只是将该节点转换为典型的 $. + path + '[#text]'
符号,其中 .value
将正则表达式匹配器规则添加到主体匹配器。
我还查看了:https://github.com/DiUS/pact-jvm/tree/master/pact-jvm-consumer-junit 其中 maxArrayLike / minArrayLike 看起来很有希望,但我不知道如何将其应用到我的案例中。
编辑2:
现在我有一个非常酷的 PactDslWithProvider 如下:
return builder.given("Genereller Test").uponReceiving("Feed soll Eintraege enthalten").path(SERVICEPATH)
.query(query).method(METHOD_GET).headers(ACCEPT, REQ_ACCEPT).willRespondWith().status(200)
.matchHeader(HEADER_CONTENT_TYPE, RESP_HEADER_CONTENT_TYPE_REGEX)
.body(responseBody)
.matchBody(new PactDslXmlNodeMatcher().node("feed").minMaxType(minNumberNodesInFeed, maxNumberNodesInFeed))
.toPact();
方法"minMaxType" 将MinMaxTypeMatcher 添加到具有节点路径的body-category。
这个的实际行为:
它匹配 $.feed
的最内部节点的类型、最小值和最大值。喜欢:$.feed.0.title
、$.feed.1.link
、...、$.feed.6.entry.0.title
但我真正想要的是验证 $.feed
具有最小和最大子节点数。我怎样才能做到这一点?
听起来您正在尝试使用 Pact 进行功能测试,而不是合同测试。一般来说,您不应该编写关心数组中有多少项的测试。阅读这两个链接,让我知道您的进展情况。
- https://docs.pact.io/best-practices/consumer#use-pact-for-contract-testing-not-functional-testing-of-the-provider
- https://docs.pact.io/best-practices/consumer/contract-tests-vs-functional-tests
此外,如果您还没有加入我们,请加入我们 slack.pact.io。
我尝试实现以下目标:
我想验证正文 ("entry") 中的特定节点是否具有最小和最大数量的直接子节点,称为 "content"(1 到 10 个节点)。我不关心这些子节点里有什么,有什么值,有多少个子节点。
因为我是新手,不知道怎么匹配这样的东西,希望有人能帮助我。 提前致谢。
编辑 1:
我使用我的一位同事构建的节点匹配器,如下所示:
return builder.given("given").uponReceiving("description").path(SERVICEPATH)
.query(query).method(METHOD_GET).headers(ACCEPT, REQ_ACCEPT).willRespondWith().status(200)
.matchHeader(HEADER_CONTENT_TYPE, RESP_HEADER_CONTENT_TYPE_REGEX).body(responseBody)
.matchBody(new PactDslXmlNodeMatcher().node("entry").node("content").value(".*")).toPact();
不要让这激怒你,.matchBody
只是将该节点转换为典型的 $. + path + '[#text]'
符号,其中 .value
将正则表达式匹配器规则添加到主体匹配器。
我还查看了:https://github.com/DiUS/pact-jvm/tree/master/pact-jvm-consumer-junit 其中 maxArrayLike / minArrayLike 看起来很有希望,但我不知道如何将其应用到我的案例中。
编辑2:
现在我有一个非常酷的 PactDslWithProvider 如下:
return builder.given("Genereller Test").uponReceiving("Feed soll Eintraege enthalten").path(SERVICEPATH)
.query(query).method(METHOD_GET).headers(ACCEPT, REQ_ACCEPT).willRespondWith().status(200)
.matchHeader(HEADER_CONTENT_TYPE, RESP_HEADER_CONTENT_TYPE_REGEX)
.body(responseBody)
.matchBody(new PactDslXmlNodeMatcher().node("feed").minMaxType(minNumberNodesInFeed, maxNumberNodesInFeed))
.toPact();
方法"minMaxType" 将MinMaxTypeMatcher 添加到具有节点路径的body-category。
这个的实际行为:
它匹配 $.feed
的最内部节点的类型、最小值和最大值。喜欢:$.feed.0.title
、$.feed.1.link
、...、$.feed.6.entry.0.title
但我真正想要的是验证 $.feed
具有最小和最大子节点数。我怎样才能做到这一点?
听起来您正在尝试使用 Pact 进行功能测试,而不是合同测试。一般来说,您不应该编写关心数组中有多少项的测试。阅读这两个链接,让我知道您的进展情况。
- https://docs.pact.io/best-practices/consumer#use-pact-for-contract-testing-not-functional-testing-of-the-provider
- https://docs.pact.io/best-practices/consumer/contract-tests-vs-functional-tests
此外,如果您还没有加入我们,请加入我们 slack.pact.io。