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, если он не установлен специально).
В любом случае, это должно работать в вашем случае, так как вы не пытаетесь остановить сервер, который уже был удален:)