Pact::JsonDiffer не работает должным образом с гемом pact-messages

Я использую гем pact-messages для создания файла Pact для потребителя поставщика очереди сообщений о событиях.

Вот файл Pact:

{
  "consumer": {
    "name": "Ice Cream"
  },
  "provider": {
    "name": "Desserts"
  },
  "interactions": [{
    "description": null,
    "providerState": "dessert_created",
    "request": {
      "method": "MESSAGE",
      "path": "/"
    },
    "response": {
      "body": {
        "attributes": {
          "event_name": "dessert_created",
          "event_time": {
            "json_class": "Pact::SomethingLike",
            "contents": "2018-03-05T21:00:32.321Z"
          }
        },
        "body": {
          "dessert_resource_link_id": {
            "json_class": "Pact::SomethingLike",
            "contents": "407245344ee3f65fe3a8b11d77ca9b11ea4660e8"
          },
          "dessert_resource_link_id_duplicated_from": {
            "json_class": "Pact::SomethingLike",
            "contents": "407245344ee3f65fe3a8b11d77ca9b11ea4660e8"
          }
        }
      }
    }
  }],
  "metadata": {
    "pactSpecification": {
      "version": "1.0.0"
    }
  }
}

Вот event_message (в Ruby), сгенерированный провайдером:

{
  "attributes" => {
    "event_name" => "dessert_created", "event_time" => "2018-04-27T21:09:06Z"
  }, "body" => {
    "dessert_id" => "21", "context_id" => "11", "context_type" => "Ice Cream", "workflow_state" => "duplicating", "title" => "Rocky Road", "description" => "chocolate with almonds and marshmallows", "updated_at" => "2018-04-27T21:09:06Z", "dessert_resource_link_id" => "769151f4f462812b8c630f3dfd8af84567a29a03", "dessert_resource_link_id_duplicated_from" => "769151f4f462812b8c630f3dfd8af84567a29a03"
  }
}

Вот код, где я сравниваю Пакт с сгенерированным сообщением:

      def has_kept_the_contract?
        diff = compare_contract_with_live_event
        contract_matches = diff.none?
        print_difference(diff) unless contract_matches
        contract_matches
      end

      private

      def compare_contract_with_live_event
        Pact::JsonDiffer.call(contract_message, event_message)
      end

      def contract_message
        Pact::Messages.get_message_contract(
          'Desserts',
          'Ice Cream',
          'dessert_created'
        )
      end

      def print_difference(diff)
        puts Pact::Matchers::UnixDiffFormatter.call(diff)
      end

Я бы ожидал has_kept_the_contract? возвращать true, но вместо этого контракт терпит неудачу и print_difference Метод выводит следующее из Pact:

Diff
--------------------------------------
Key: - is expected
     + is actual
Matching keys and values are not shown

 {
   "attributes": {
-    "event_time": {
-      "json_class": "Pact::SomethingLike",
-      "contents": "2018-03-05T21:00:32.321Z"
-    }
+    "event_time": "2018-04-27T20:58:44Z"
   },
   "body": {
-    "dessert_resource_link_id": {
-      "json_class": "Pact::SomethingLike",
-      "contents": "407245344ee3f65fe3a8b11d77ca9b11ea4660e8"
-    },
-    "dessert_resource_link_id_duplicated_from": {
-      "json_class": "Pact::SomethingLike",
-      "contents": "407245344ee3f65fe3a8b11d77ca9b11ea4660e8"
-    }
+    "dessert_resource_link_id": "67ad1125cec845b128dac090565dc4e59d687df3",
+    "dessert_resource_link_id_duplicated_from": "67ad1125cec845b128dac090565dc4e59d687df3"
   }
 }

Description of differences
--------------------------------------
* Expected a Hash but got a String ("2018-04-27T20:58:44Z") at $.attributes.event_time
* Expected a Hash but got a String ("67ad1125cec845b128dac090565dc4e59d687df3") at $.body.dessert_resource_link_id
* Expected a Hash but got a String ("67ad1125cec845b128dac090565dc4e59d687df3") at $.body.dessert_resource_link_id_duplicated_from

Кажется, Пакт сравнивает полный "item": { "json_class": "..", "contents": ".." } хеш с ожидаемым значением String вместо сравнения item["contents"] с ожидаемым значением String, как указано в исходном коде соответствия pact-support, но я не знаю, почему или как это исправить.

Странно то, что у меня есть контрактные тесты pact-сообщений, работающие в другом проекте, и код практически идентичен. Я безуспешно отлаживаю и погружаю исходный код в различные репозитории Pact. Я в тупике. Предложения?

pact версия драгоценного камня 1.22.2

pact-messages версия драгоценного камня 0.2.0

рубиновая версия 2.4

1 ответ

Этот камень не был написан основной командой Пакта. Официальная жемчужина сообщения Pact https://github.com/pact-foundation/pact-message-ruby в настоящее время находится в альфа-версии, но вскоре должна быть готова к производству.

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