Как реализовать метод "or ()" в dius.pact - PullRequest
0 голосов
/ 17 октября 2019

Я пишу пакт-тест, и мне нужна переменность.

Это мой фактический метод определения объекта цены:

private static LambdaDslObject definePrice(LambdaDslObject object) {
  return object
      .stringType("type") // <--- could be empty or has 2 different values
      .stringType("currencyCode", "EUR")
      .numberType("centAmount")
      .numberType("fractionDigits");
}

, но этот объект цены может выглядеть следующим образом:JSON:

если тип "centPrecision" или пустой:

"value": {
  "type": "centPrecision",
  "currencyCode": "EUR",
  "preciseAmount": 2800,
  "fractionDigits": 2 // <--- is not mandatory in this case
}
or
"value": {
  "currencyCode": "EUR",
  "preciseAmount": 2800,
  "fractionDigits": 2 // <--- is not mandatory in this case
}

или тип "highPrecision"

"value": {
  "type": "highPrecision",
  "currencyCode": "EUR",
  "centAmount": 2800, // <--- is not mandatory in this case
  "preciseAmount": 2800,
  "fractionDigits": 2
}

, поэтому мне нужно различение по типуцены
Я нашел этот or() метод, но на самом деле не знаю, как его реализовать.
как я могу реализовать это для пакта?

1 Ответ

1 голос
/ 18 октября 2019

В этом случае я написал бы два теста Pact и использовал бы состояние провайдера , чтобы сообщить провайдеру, какой из них производить.

Обоснование

Каждый отдельный тест пактаимеет ряд светильников. Мы назовем их P , X , Y , Z и O . Эти приборы используются для следующих утверждений:

  1. Когда вызывается код потребителя с некоторыми параметрами P
  2. Затем запрашивается X отправляется поставщику
  3. Когда поставщик находится в состоянии Y , он выдает ответ Z
  4. Когда потребитель получает ответ Z, объект домена O возвращается вызывающей стороне с шага 1.

Если в вашем тесте or, у вас есть два различных значения Z . В свою очередь, у вас будет два разных значения O и либо два разных значения X и P , либо два разных значения Y (или оба), в зависимости от того, изменяется ли тип в Z в зависимости от запроса или нет.

Допустим, ответ в Z изменяется в зависимости от состояния провайдера (более простой случай). Если вы используете or, ваш тест теперь будет выглядеть следующим образом

  1. Когда код потребителя вызывается с некоторыми параметрами P
  2. Затем запрос X отправляется поставщику
  3. Когда поставщик находится в состоянии Y-1 , он выдает ответ Z-1 , или если он находится в состоянии Y-2 выдает ответ Z-2
  4. Когда потребитель получает ответ Z-1 , объект домена O-1 возвращается вызывающей стороне с шага 1, или если потребитель получает ответ Z-2 , объект домена O-2 возвращается вызывающей стороне.

Это значительно сложнее, чем разделение на два теста.

Два теста

Тест одного может быть что-то вроде:

  1. Когда потребителькод вызывается с (независимо от параметров)
  2. Отправляется запрос на LambdaDslObject
  3. Когда состояние провайдера равно response is centPrecision, он выдает:
    "value": {
      "type": "centPrecision",
      "currencyCode": "EUR",
      "preciseAmount": 2800,
      "fractionDigits": 2 // <--- is not mandatory in this case
    }
, который возвращает соответствующий объект домена вызывающей стороне.

И проверка два может быть что-то вроде:

  1. Когда код потребителя вызывается с (любые параметры)
  2. Отправляется запрос на LambdaDslObject
  3. Когда состояние провайдера равно response is highPrecision, оно выдает:
    "value": {
      "type": "highPrecision",
      "currencyCode": "EUR",
      "centAmount": 2800, // <--- is not mandatory in this case
      "preciseAmount": 2800,
      "fractionDigits": 2
    }

КакКроме того, помните, что ваш тест Pact должен описывать только те поля ответов, которые потребитель фактически использует - он не предназначен для полного описания полей, возвращаемых поставщиком. Таким образом, вы можете удалить необязательные поля из ответа.

...