PACT.io: Ошибка получения пропущенных запросов, при запуске npm запустите pactTest - PullRequest
0 голосов
/ 26 сентября 2018

Создан тестовый репо: https://github.com/leongaban/pact-io-js-test

enter image description here

Ожидается

Выполнить npm run pactTest, что создаст Пактфайл для моего TotalPayout.test.pact.ts файла.

Результаты

D, [#38238] 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"
    }
  }
}
W, [#38238]  WARN -- : Verifying - actual interactions do not match expected interactions. 
Missing requests:
  GET /frontoffice/api/liquidity-pool/get-total-payout


W, [#38238]  WARN -- : Missing requests:
  GET /frontoffice/api/liquidity-pool/get-total-payout

Вот мой Пакт-файл

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

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

const EXPECTED_BODY = {
  total_payout: 100.21,
};

const userId = 'foo';

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'
          },
          data: 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) => {
          console.log('response', response);
          console.log('EXPECTED_BODY', EXPECTED_BODY);
          expect(response).toEqual(EXPECTED_BODY);
        })
        .then(done);
    });
  });
});

Вотслужебный файл, содержащий функцию getTotalPayout :

Эта конечная точка еще не существует, но этот тест Pact должен работать, насколько я понимаю.

// @TODO Note, this is the placeholder for LiquidityPool API endpoints
// @ts-ignore
import axios, * as others from 'axios';

const endpoint = '/frontoffice/api/liquidity-pool/';

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

Также мой axios макет в src/__mocks__/axios.ts

// tslint:disable-next-line:no-empty
const mockNoop = () => new Promise(() => {});

export default {
  get: jest.fn(() => Promise.resolve({ data: { total_payout: 100.21 }})),
  default: mockNoop,
  post: mockNoop,
  put: mockNoop,
  delete: mockNoop,
  patch: mockNoop
};

1 Ответ

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

Проще говоря - ваш тест не с указанием пути /frontoffice/api/liquidity-pool/get-total-payout на сервере Pact Mock.

У вас настроен запуск Pact на http://localhost:1234, поэтому ваш фактический код требуетчтобы быть настроенным на попадание на этот сервер, а не на настоящий.

В вашей конфигурации axios вы макетируете библиотеку http-запросов, поэтому она ничего не делает.Поэтому, когда ваш реальный код использует его, он не делает вызов http и ваши тесты Pact не срабатывают, потому что он ожидал вызова определенной формы и не получил его.

Вот то, чтовам нужно изменить:

  1. Аксиос, кажется, используется, но отсутствует в вашем package.json.Я предполагаю, потому что вы издеваетесь над этим (2).Вам нужна реальная библиотека HTTP-запросов, поэтому вам, вероятно, нужно просто установить axios
  2. Axios отключен для предоставления готовых ответов, НЕ ИСПОЛЬЗУЙТЕ axios во время тестирования Pact (это нормально для локального dev, если хотите), так какпредотвратит реальные звонки в Pact.Pact нужны реальные HTTP-вызовы, чтобы он мог проверить, правильно ли работает ваш код, а затем записать то, что он нашел, в «контракт»
  3. Сконфигурировать axios в тестах для запуска службы Pact mock.Что-то вроде следующего должно сделать, предполагая, что вы используете axios:

pactSetup.ts:

  // Configure axios to use the Pact mock server for Pact tests
  import axios from "axios";
  axios.defaults.baseURL = "http://localhost:1234";
Прочитайте файлы журналов, которые выдает Pact.Это говорит вам, что происходит.Повторим: вы сказали Pact, что должно быть взаимодействие с /frontoffice/api/liquidity-pool/get-total-payout, но оно так и не получило его.Сделайте так, чтобы ваш реальный код ударил по этому, и тогда у вас все будет хорошо.

И наконец, вы можете использовать Pact в качестве локального сервера-заглушки для локальной разработки, как только вы начали генерироватьПакты (после 1-4 фиксируются).Бинарный файл уже установлен в ваших node_modules, и документы о том, как он работает, находятся по адресу https://github.com/pact-foundation/pact-ruby-standalone/releases

. У меня обычно есть скрипт в package.json, который выглядит примерно так:

  "stubs": "$(find . -name pact-stub-service | head -n 1) pacts/* --port 4000"

Затем вы можете запустить npm run stubs и получить локальную заглушку провайдера, работающую на порту 4000, со всеми запросами / ответами, которые вы поместили в свои тесты.

...