如何使用Lambda Dsl for Pact为“ arrayMinLike”生成相同的匹配规则?

时间:2018-10-30 12:00:42

标签: lambda pact pact-jvm

我的身体如下:

[
  "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"
                        }
                    }
                }

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

  

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

下面是代码和我的代码生成的匹配规则。请注意$[0]$[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产生相同的匹配规则吗?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。请查看问题和解决方法here

例如:-

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();