Почему этот тест провайдера pact-jvm не работает?

У нас есть тест провайдера, который дает сбой только на Jenkins, что мешает мне отлаживать.

Вот некоторые соответствующие журналы от Jenkins:

Error Message

0 - $.body.2 -> Expected name='FXUHHqWrZZcodhHBmeLf' but was missing


0) a request to get all clients returns a response which has a matching body
      $.body.2 -> Expected name='FXUHHqWrZZcodhHBmeLf' but was missing

      Diff:

(некоторые упущения…)

  @10
          ],
  -        "id": "c53927c3-0d1c-48a8-8f0a-7560be89daa5",
  -        "name": "FXUHHqWrZZcodhHBmeLf",
  +        "id": "9daaad0a-8a2d-4e73-a963-fa1625cec110",
  +        "name": "name",
  +        "privileges": [
  +            "CHECK_TOKEN",
  +            "MANAGE_CLIENT",
  +            "MANAGE_IDP",
  +            "MANAGE_USER"
  +        ],
          "redirectUris": [

И взаимодействие выглядит так в файле pact:

{
        "description": "a request to get all clients",
        "request": {
            "method": "GET",
            "path": "/some/url/client"
        },
        "response": {
            "status": 200,
            "headers": {
                "Content-Type": "application/json; charset=UTF-8"
            },
            "body": [
                {
                    "accessTokenValiditySeconds": 42721462,
                    "allowedScopes": [
                        "JnTfAlnHKVSDzoWnUqZv"
                    ],
                    "autoApprove": true,
                    "grantTypes": [
                        "VfWudsTQINERQCnVKvoK"
                    ],
                    "id": "c53927c3-0d1c-48a8-8f0a-7560be89daa5",
                    "name": "FXUHHqWrZZcodhHBmeLf",
                    "redirectUris": [
                        "vWxSTjgJQvwUtwphDGcn"
                    ],
                    "refreshTokenValiditySeconds": 12393550,
                    "secretRequired": true
                }
            ],
            "matchingRules": {
                "$.body[*].allowedScopes[*]": {
                    "match": "type"
                },
                "$.body[*].redirectUris[*]": {
                    "match": "type"
                },
                "$.body[*].grantTypes[*]": {
                    "match": "type"
                },
                "$.body[*].redirectUris": {
                    "min": 0,
                    "match": "type"
                },
                "$.body[*].autoApprove": {
                    "match": "type"
                },
                "$.body": {
                    "min": 1,
                    "match": "type"
                },
                "$.body[*].id": {
                    "regex": "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"
                },
                "$.body[*].accessTokenValiditySeconds": {
                    "match": "integer"
                },
                "$.body[*].secretRequired": {
                    "match": "type"
                },
                "$.body[*].refreshTokenValiditySeconds": {
                    "match": "integer"
                },
                "$.body[*].name": {
                    "match": "type"
                },
                "$.body[*].allowedScopes": {
                    "min": 0,
                    "match": "type"
                },
                "$.body[*].grantTypes": {
                    "min": 0,
                    "match": "type"
                }
            }
        },
        "providerState": "the 'zero' client exists"
    },

У меня сложилось впечатление, что имя должно совпадать по типу, а не по точному значению, и кажется, что в diff есть поле «имя».

Почему этот тест не работает?

редактировать:

Это код для создания фрагмента пакта:

           builder
            .given("the 'zero' client exists")
            .uponReceiving("a request to get all clients")
            .path("/some/url/client")
            .method("GET")
            .willRespondWith()
            .status(200)
            .body(PactDslJsonArray
                    .arrayMinLike(1)
                    .uuid("id")
                    .booleanType("secretRequired")
                    .eachLike("allowedScopes", stringType())
                    .eachLike("grantTypes", stringType())
                    .eachLike("redirectUris", stringType())
                    .integerType("accessTokenValiditySeconds")
                    .integerType("refreshTokenValiditySeconds")
                    .booleanType("autoApprove")
                    .stringType("name")
                    .closeObject())
            .toFragment();

person Fitzoh    schedule 18.01.2017    source источник
comment
Я помню, что был особый случай, когда корневой объект в ответе JSON представляет собой массив, где требуется другой сопоставитель. Пробовали ли вы «arrayEachLike», как описано в github.com/DiUS/pact-jvm/tree/master/ ?   -  person Matthew Fellows    schedule 19.01.2017
comment
@MatthewFellows Я использую ArrayMinLike. Фрагмент доступен здесь: gist.github.com/cah-andrewfitzgerald/   -  person Fitzoh    schedule 19.01.2017


Ответы (1)


Важным битом информации в журналах является бит «но отсутствовал». Кажется, это указывает на то, что в третьем элементе массива (совпадающем с «$.body.2») отсутствовал атрибут имени.

Не могли бы вы еще раз проверить полный ответ, и если в третьем элементе есть атрибут имени, не могли бы вы поднять вопрос по адресу https://github.com/DiUS/pact-jvm.

person Ronald Holshausen    schedule 18.01.2017