Контрактный тест для потребителя Java и поставщика JavaScript

Sep 01 2020

У нас есть 2 сервиса, одна из которых является потребителем другой. Потребитель написан на Java, а поставщик написан на JavaScript.

На стороне потребителя мы определили тест-контракт потребителя с помощью pact-jvm, и мы можем создать контракт. В этом контракте ответ определяется как:

"response": {
  "status": 200,
  "headers": {
    "Content-Type": "application/json"
  },
  "body": [
    "test"
  ]
},

В нашем провайдере мы сейчас пытаемся определить тест-контракт-поставщик с использованием pact-js, но мы сталкиваемся с проблемой, когда в pact-js мы используем a MessageProviderPactдля проверки контракта. Но при запуске теста ожидается, что тело будет в таком атрибуте содержимого:

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

       -[
       -  "test"
       -]
       +{
       +  "contents": {
       +    "statusCode": 200,
       +    "body": "[test]"
       +  }
       +}

Код, используемый для проверки пакта

const p = new MessageProviderPact({
        messageProviders: {
            '': handler
        },
        provider: 'provider-service',
        pactUrls: [
            path.resolve(
                process.cwd(),
                'pacts',
                'consumer-service-provider-service.json'
            )
        ]
    });

Есть идеи, как это решить? Можно ли использовать аналогичную структуру сообщения с ключом содержимого на стороне потребителя? Или мы можем решить это любым другим способом на стороне провайдера

Ответы

MatthewFellows Sep 02 2020 at 06:58

MessageProviderPactпредназначен для взаимодействий типа очереди сообщений, а не для HTTP-взаимодействий. Думаю нужен стандартный Verifierкласс (https://github.com/pact-foundation/pact-js/#provider-api-testing):

const { Verifier } = require('@pact-foundation/pact');
let opts = {
  ...
};

new Verifier(opts).verifyProvider().then(function () {
    // do something
});