Pact JS (Jest) Остановка пакта не удалась; пробовал звонить в сервис 10 раз безрезультатно

Я получаю сообщение об ошибке с реализацией Pact JS на стороне потребителя. Когда я пытаюсь запустить свои тесты, я получаю следующую ошибку:

    Pact stop failed; tried calling service 10 times with no result.

Прикрепление фрагментов моего кода ниже, если это поможет:

import Pact from "pact";
import wrapper from "@pact-foundation/pact-node";

const mockEventsService = wrapper.createServer({
    port: 1234,
    spec: 2
});

let provider;

beforeEach(done => {
   mockEventsService
    .start()
    .then(() => {
      provider = Pact({
        consumer: "Frontend",
        provider: "Backend",
        port: 1234
      });
      done();
  })
    .catch(err => catchAndContinue(err, done));
});

afterAll(() => {
  wrapper.removeAllServers();
});

afterEach(done => {
  mockEventsService
    .delete()
    .then(() => {
      done();
    })
    .catch(err => catchAndContinue(err, done));
});

function catchAndContinue(err, done) {
  fail(err);
  done();
}

В самом тесте:

afterEach(done => {
    provider
      .finalize()
      .then(() => done())
      .catch(err => catchAndContinue(err, done));
  });

Любая помощь будет принята с благодарностью. Я новичок в этом и не знаю, как это исправить.

Использование pact: 4.2.1 и @pact-foundation/pact-node: 6.0.0

1 ответ

Решение

Я предполагаю, что это потому, что ты звонишь delete вместо stop в вашем после каждого. Удалить остановит службу, а также попытаться удалить экземпляр вашего класса в целом.

Лично мне не нравится создавать отдельный сервис, который затем запускается / останавливается, поскольку вы не позволяете себе запускать параллельные тесты. Мой предпочтительный подход заключается в создании нового экземпляра pact для каждого теста на случайном порте (он делает это для вас), который затем удаляется в конце. Таким образом, вы гарантируете свежий экземпляр каждый раз. Это будет выглядеть примерно так:

import Pact from "pact";
import PactNode from "@pact-foundation/pact-node";

describe("Some Test Suite", () => {    
  let provider;
  let mockService;

  beforeEach(() => {
    let mockService = wrapper.createServer({ spec: 2 });
    return mockService
      .start()
      .then(() => {
        provider = Pact({
          consumer: "Frontend",
          provider: "Backend",
          port: mockService.options.port // pact-node listens to a randomized, unused port by default
        });
      }, fail);
  });

  afterEach(() => mockEventsService.delete().catch(fail));
}

Похоже, вы используете Jasmine или Mocha, так или иначе, обе эти платформы поддерживают обещания, пока вы возвращаете обещание как часть функции, следовательно, вам не нужно done функционирует везде В этом конкретном случае я разрешаю pact выбрать, какой порт использовать, а затем провайдер использует параметр порта (он автоматически заполняется узлом pact, если он не установлен специально).

В любом случае, это должно работать в вашем случае, так как вы не пытаетесь остановить сервер, который уже был удален:)

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