Pact JS(Jest)Pact停止失败;尝试拨打服务10次没有结果

时间:2017-11-22 18:48:28

标签: javascript jest 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));
  });

非常感谢任何帮助。我是新手,并且不知道如何解决这个问题。

使用pact:4.2.1和@ pact-foundation / pact-node:6.0.0

1 个答案:

答案 0 :(得分:0)

我猜这是因为你在afterEach中调用了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,无论哪种方式,这两个框架都支持promises,只要你将promise作为函数的一部分返回,因此你不需要done个函数。在这种特殊情况下,我让pact选择运行哪个端口,然后提供程序正在使用port选项(当没有专门设置时,它会被pact-node自动填充)。

无论哪种方式,这都适用于您的情况,因为您没有尝试停止已经删除的服务器:)