Pact JS (Jest) Pact 停止失败;尝试调用服务 10 次但没有结果
Pact JS (Jest) Pact stop failed; tried calling service 10 times with no result
我在消费者端的 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));
});
如有任何帮助,我们将不胜感激。我是新手,不知道如何解决这个问题。
使用协议:4.2.1 和@pact-foundation/pact-node:6.0.0
我猜这是因为您在 afterEach 中调用 delete
而不是 stop
。删除将停止服务,并尝试完全删除 class 的实例。
就个人而言,我不喜欢创建一个单独的服务,然后 starts/stops 因为您正在阻止自己进行并发测试 运行ning。我的首选方法是为随机端口上的每个测试创建一个新的契约实例(它为你做),然后在最后删除。这样,您每次都能保证一个新实例。这看起来像这样:
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,无论哪种方式,只要您 return 承诺作为函数的一部分,这两种框架都支持承诺,因此您不需要 done
无处不在。在这种特殊情况下,我让 pact 选择 运行 打开哪个端口,然后提供者使用端口选项(当未专门设置时,它会由 pact-node 自动填充)。
无论如何,这应该适用于您的情况,因为您没有试图停止已被删除的服务器:)
我在消费者端的 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));
});
如有任何帮助,我们将不胜感激。我是新手,不知道如何解决这个问题。
使用协议:4.2.1 和@pact-foundation/pact-node:6.0.0
我猜这是因为您在 afterEach 中调用 delete
而不是 stop
。删除将停止服务,并尝试完全删除 class 的实例。
就个人而言,我不喜欢创建一个单独的服务,然后 starts/stops 因为您正在阻止自己进行并发测试 运行ning。我的首选方法是为随机端口上的每个测试创建一个新的契约实例(它为你做),然后在最后删除。这样,您每次都能保证一个新实例。这看起来像这样:
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,无论哪种方式,只要您 return 承诺作为函数的一部分,这两种框架都支持承诺,因此您不需要 done
无处不在。在这种特殊情况下,我让 pact 选择 运行 打开哪个端口,然后提供者使用端口选项(当未专门设置时,它会由 pact-node 自动填充)。
无论如何,这应该适用于您的情况,因为您没有试图停止已被删除的服务器:)