【问题标题】:Pact JS (Jest) Pact stop failed; tried calling service 10 times with no resultPact JS (Jest) Pact 停止失败;尝试调用服务 10 次没有结果
【发布时间】:2017-11-24 13:31:13
【问题描述】:

我在消费者端的 Pact JS 实现中遇到了错误。当我尝试运行测试时,出现以下错误:

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

如果有帮助,请在下面附上我的代码的 sn-ps:

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

【问题讨论】:

    标签: javascript jestjs pact pact-node


    【解决方案1】:

    我猜这是因为您在 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,只要您将 Promise 作为函数的一部分返回,这两个框架都支持 Promise,因此您不需要在任何地方使用 done 函数。在这种特殊情况下,我让 pact 选择要在哪个端口上运行,然后提供程序使用 port 选项(如果没有专门设置,它会由 pact-node 自动填充)。

    无论哪种方式,这应该适用于您的情况,因为您不会尝试停止已被删除的服务器 :)

    【讨论】:

    • 谢谢,我试试看。会告诉你进展如何
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 2023-02-15
    • 1970-01-01
    相关资源
    最近更新 更多