Как сгенерировать Pact-файл с телом ответа, совпадающим с массивом Strings с помощью groovy

Я новичок в Пакте и новичок в Groovy тоже.

Я хочу написать Пакт, чтобы передать его поставщику.

Поставщик должен ответить на данный запрос с массивом строк, таких как ["foo", "bar", "foobar"],

Вот мое рабочее состояние, которое разделено на необходимые части, но все еще выполнимо:

import au.com.dius.pact.consumer.groovy.PactBuilder
import groovyx.net.http.RESTClient
import spock.lang.Specification

class MyPact extends Specification {
    def "some test"() {
        given:
        when:

        def pactBuilder = new PactBuilder()
        pactBuilder {
            serviceConsumer "consumer"
            hasPactWith "provider"
            port 1234
            given('some provider state')
            uponReceiving('a request')
            withAttributes(method: 'get', path: '/my/endpoint')
            willRespondWith(status: 200)
            withBody(["foo", "bar", "foobar"])
        }

        pactBuilder.run() { mockServer ->
            RESTClient('http://localhost:1234/').get(path: '/my/endpoint')
        }

        then: 1 == 1

    }
}

Этот тест генерирует следующий файл пакта:

{
  "provider": {
    "name": "provider"
  },
  "consumer": {
    "name": "consumer"
  },
  "interactions": [
    {
      "description": "a request",
      "request": {
        "method": "GET",
        "path": "/my/endpoint"
      },
      "response": {
        "status": 200,
        "headers": {
          "Content-Type": "application/json"
        },
        "body": [
          "foo",
          "bar",
          "foobar"
        ]
      },
      "providerStates": [
        {
          "name": "some provider state"
        }
      ]
    }
  ],
  "metadata": {
    "pact-specification": {
      "version": "3.0.0"
    },
    "pact-jvm": {
      "version": "3.5.6"
    }
  }
}

Файл Pact ожидает, что поставщик всегда ответит ["foo", "bar", "foobar"]

То, что я хочу, это общий массив строк.

Когда я попробую следующее:

withBody {
    key eachLike (3, "foo")
}

сгенерированный файл Pact выглядит так:

{
  "provider": {
    "name": "provider"
  },
  "consumer": {
    "name": "consumer"
  },
  "interactions": [
    {
      "description": "a request",
      "request": {
        "method": "GET",
        "path": "/my/endpoint"
      },
      "response": {
        "status": 200,
        "headers": {
          "Content-Type": "application/json"
        },
        "body": {
          "key": [
            "foo",
            "foo",
            "foo"
          ]
        },
        "matchingRules": {
          "body": {
            "$.key": {
              "matchers": [
                {
                  "match": "type"
                }
              ],
              "combine": "AND"
            }
          }
        }
      },
      "providerStates": [
        {
          "name": "some provider state"
        }
      ]
    }
  ],
  "metadata": {
    "pact-specification": {
      "version": "3.0.0"
    },
    "pact-jvm": {
      "version": "3.5.6"
    }
  }
}

Есть соответствующие правила, и это выглядит хорошо. Но есть объект на корневом уровне, и мне нужен массив, чтобы быть корнем.

Есть ли способ получить массив в качестве корневого элемента и строки, сопоставленные по типу, а не по значению?

0 ответов

Другие вопросы по тегам