Ошибка с тестом Typescript Pact.io: PopsicleError: невозможно подключиться к - PullRequest
0 голосов
/ 19 сентября 2018

Ожидается: Запуск npm run pactTest должен создать файл пакта (JSON).

Результаты: Я получаю Unable to connect ошибку.

Руководство по реализации Pact.io JavaScript.

Пример теста машинописи Pact.io.

Цените любые мысли или идеи относительно того, что я 'я делаю неправильно:)


Ошибка

FAIL src / services / api / TotalPayout.test.pact.ts API getUsersTotalPayout ✕ Следуетвызовите getUsersTotalPayout и верните объект с total_payout (45 мс)

● API ›getUsersTotalPayout› Должен вызвать getUsersTotalPayout и вернуть объект с total_payout

PopsicleError: невозможно подключиться к «http://127.0.0.1:12345/interactions" Причина: ошибка: подключить ECONNREFUSED 127.0.0.1:12345

 at Request.Object.<anonymous>.Request.error (node_modules/popsicle/src/request.ts:91:12)
  at ClientRequest.<anonymous> (node_modules/popsicle/src/index.ts:218:31)

package.json script:

"pactTest": "export NODE_ENV=pactTest && jest --testRegex \"/*(.test.pact.ts)\" --runInBand --setupFiles ./pactSetup.ts --setupTestFrameworkScriptFile ./pactTestWrapper.ts",

Мой файл src / pactSetup.ts

// @ts-ignore
import path from 'path';
import { Pact } from '@pact-foundation/pact/pact';
​
// @ts-ignore
global.provider = new Pact({
  port: 1234,
  log: path.resolve(process.cwd(), 'logs', 'mockserver-integration.log'),
  dir: path.resolve(process.cwd(), 'pacts'),
  spec: 2,
  cors: true,
  pactfileWriteMode: 'update',
  consumer: 'Exchange',
  provider: 'LP Service'
});

Мой src / pactTestWrapper.ts

jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; // This is to give the pact mock server time to start
​
// @ts-ignore
beforeAll(() => provider.setup()); // Create mock provider
// @ts-ignore
afterEach(() => provider.verify()); // Ensure the mock provider verifies expected interactions for each test
// @ts-ignore
afterAll(() => provider.finalize()); // Tear down the mock and write the pact

st: src / services / api / TotalPayout.test.pact.ts

// @ts-ignore
import path from 'path';
import { Pact } from '@pact-foundation/pact';
import { getTotalPayout } from './apiPayout';

const port = 12345;
const endpoint = '/frontoffice/api/get-total-payout';

const EXPECTED_BODY = {
  total_payout: 100.21,
};

const userId = 'foo';

const provider = new Pact({
  port,
  log: path.resolve(process.cwd(), 'logs', 'mockserver-integration.log'),
  dir: path.resolve(process.cwd(), 'pacts'),
  spec: 2,
  consumer: 'Exchange',
  provider: 'LP Service',
  pactfileWriteMode: 'merge'
});
​​
describe('The API', () => {
  // Copy this block once per interaction under test
  describe('getUsersTotalPayout', () => {
    beforeEach(() => {
      const interaction = {
        uponReceiving: 'a GET request with a user id',
        withRequest: {
          method: 'GET',
          path: endpoint,
          headers: {
            Accept: 'application/json',
          },
        },
        willRespondWith: {
          status: 200,
          headers: {
            'Content-Type': 'application/json'
          },
          body: EXPECTED_BODY
        },
      };

      // @ts-ignore
      return provider.addInteraction(interaction);
    });
​
    // add expectations
    it('Should call getUsersTotalPayout and return an object with the total_payout', done => {
      getTotalPayout(userId)
        .then((response: any) => {
          expect(response).toEqual(EXPECTED_BODY);
        })
        .then(done);
    });
  });
});

Файл службы API apiPayout.ts

// @ts-ignore
import axios, * as others from 'axios';

const endpoint = '/frontoffice/api/';

export const getTotalPayout = async (userId: string) => {
  const response = await axios.get(`${endpoint}get-total-payout`, { params: userId });
  return response.data;
};

Из журнала mockserver -gration.log

I, [2018-09-19T11:07:41.259437 #79922]  INFO -- : Verifying - interactions matched
I, [2018-09-19T11:07:41.264440 #79922]  INFO -- : Cleared interactions

Из журнала отладки

20 error code ELIFECYCLE
21 error errno 1
22 error react-redux-starter-kit@1.0.0 pactTest: `export NODE_ENV=pactTest && jest --testRegex "/*(.test.pact.ts)" --runInBand --setupFiles ./pactSetup.ts --setupTestFrameworkScriptFile ./pactTestWrapper.ts`
22 error Exit status 1
23 error Failed at the react-redux-starter-kit@1.0.0 pactTest script.

Обновление

После комментированияиз логики настройки провайдера в файле test.pact и повторного запуска npm run pactTest я получаю следующее:

console.error node_modules/@pact-foundation/pact/pact.js: 110 Pactпроверка не удалась!

console.error node_modules/@pact-foundation/pact/pact.js: 111 Фактические взаимодействия не соответствуют ожидаемым взаимодействиям для фиктивного MockService.

Пропущенные запросы: GET / frontoffice /API / Liquidity-Pool / Get-Total-Payout

Подробнее см. /Users/leongaban/projects/trade.io/tradeio-front/logs/mockserver-integration.log.

enter image description here

И мой обновленный mockserver-intergration.log

I, [2018-09-19T14:12:19.128823 #82330]  INFO -- : Registered expected interaction GET /frontoffice/api/liquidity-pool/get-total-payout
D, [2018-09-19T14:12:19.129127 #82330] DEBUG -- : {
  "description": "a GET request with a user id",
  "request": {
    "method": "GET",
    "path": "/frontoffice/api/liquidity-pool/get-total-payout",
    "headers": {
      "Accept": "application/json"
    }
  },
  "response": {
    "status": 200,
    "headers": {
      "Content-Type": "application/json"
    },
    "body": {
      "total_payout": 100.21
    }
  }
}
W, [2018-09-19T14:12:19.139198 #82330]  WARN -- : Verifying - actual interactions do not match expected interactions. 
Missing requests:
    GET /frontoffice/api/liquidity-pool/get-total-payout


W, [2018-09-19T14:12:19.139254 #82330]  WARN -- : Missing requests:
    GET /frontoffice/api/liquidity-pool/get-total-payout

1 Ответ

0 голосов
/ 19 сентября 2018

Несколько проблем, на которые я могу указать:

  • Вы, кажется, дважды объявляете и запускаете сервер pact-макета: в файле src/pactSetup.ts, а также в TotalPayout.test.pact.ts, который я 'Я не уверен, что это то, что вы намеревались сделать.Возможно, вы захотите избежать объявления провайдера в тесте TotalPayout, и вместо этого у вас уже есть объект provider в глобальной области видимости как часть файлов установки инфраструктуры тестирования.

  • Вкод apiPayout.ts вы ссылаетесь на URL конечной точки, но на какой порт она отправляет запрос?Этот вызов API должен быть в конечном итоге перехвачен провайдером pact-макета, который вы раскручиваете.Если вы звоните на порт, отличный от того, который прослушивает провайдер, вы никогда не поразите его.

  • Небольшой отрывок: /frontoffice/api/get-total-payout не является RESTful.Вы хотите избегать включения глаголов, таких как «get», в свой API и использовать для этого подходящий метод HTTP (GET).

...