0

我有一个样本主体如下;

[
  "01/01/2019",
  "01/02/2019",
  "01/03/2019"
]

我想验证以下内容: 1. 响应应该是一个至少包含 1 个元素的数组 2. 每个元素应该是:2.1。字符串 2.2。应该是这种格式“DD/MM/YYYY”

它与“旧”风格完美搭配:

DslPart body = PactDslJsonArray.arrayMinLike(1, 2, PactDslJsonRootValue.stringMatcher(Constants.DATETIMEPATTERN, "01/01/2019"));

这将生成具有匹配规则的协议文件,如下所示。注意$$[*]

...
                "matchingRules": {
                    "body": {
                        "$": {
                            "matchers": [
                                {
                                    "match": "type",
                                    "min": 1
                                }
                            ],
                            "combine": "AND"
                        },
                        "$[*]": {
                            "matchers": [
                                {
                                    "match": "regex",
                                    "regex": "^(([0-3]?\\d+)\\/((0?[1-9])|(1[0-2]))\\/20\\d{2})$"
                                }
                            ],
                            "combine": "AND"
                        }
                    }
                }

但是,当我尝试使用“新”样式,即lambda Dsl for Pact (Java8)时,它不会生成相同的匹配规则;因此不能以相同的方式工作,并且我的提供程序测试总是失败并显示以下错误消息

$ -> 期望一个包含 1 个元素但收到 3 个元素的列表

下面是我的代码生成的代码和匹配规则。注意$[0]and $[1]: 匹配规则

...
"matchingRules": {
                    "body": {
                        "$[0]": {
                            "matchers": [
                                {
                                    "match": "regex",
                                    "regex": "^(([0-3]?\\d+)\\/((0?[1-9])|(1[0-2]))\\/20\\d{2})$"
                                }
                            ],
                            "combine": "AND"
                        },
                        "$[1]": {
                            "matchers": [
                                {
                                    "match": "type",
                                    "min": 1
                                }
                            ],
                            "combine": "AND"
                        }
                    }
                }

和代码

DslPart body = newJsonArray((array) -> {
    array
            .stringMatcher(Constants.DATETIMEPATTERN, "01/01/2019");
}).minArrayLike(1).build();

尝试了另一种方式

DslPart body = newJsonArray((array) -> {
    array
            .stringMatcher(Constants.DATETIMEPATTERN, "01/01/2019")
            .minArrayLike(1);
}).build();

我一直在尝试将它们.minArrayLike(1)放在不同的地方,但它们都不起作用。无论如何使用 lambda Dsl for Pact 产生相同的匹配规则吗?

4

1 回答 1

0

我遇到了同样的问题。请在 此处查看问题和解决方案

例如:-

final DslPart actualPactDsl = LambdaDsl.newJsonBody((bodyDsl) -> {
            bodyDsl
                    .stringType("id", "1")
                    .stringType("name","Dep 1")
                    .minArrayLike("students",1,(stud) ->{
                        stud
                            .stringType("id","1")
                               .stringType("firstName","John")
                               .stringType("lastName","Smith")
                               .numberType("age",21);
                    });

        }).build();
于 2019-06-25T18:08:25.730 回答