首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pact JS (Jest)契约停止失败;尝试呼叫服务10次,但没有结果

Pact JS (Jest)契约停止失败;尝试呼叫服务10次,但没有结果
EN

Stack Overflow用户
提问于 2017-11-22 18:48:27
回答 1查看 695关注 0票数 0

我在消费者端的契约JS实现中出现了一个错误。当我试图运行我的测试时,我会得到以下错误:

代码语言:javascript
复制
    Pact stop failed; tried calling service 10 times with no result.

如果有任何帮助,请在下面附加代码片段:

代码语言:javascript
复制
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();
}

在试验本身:

代码语言:javascript
复制
afterEach(done => {
    provider
      .finalize()
      .then(() => done())
      .catch(err => catchAndContinue(err, done));
  });

任何帮助都将不胜感激。我是新来的,不知道怎么解决这个问题。

使用pact: 4.2.1和@pact-foundation/pact-节点: 6.0.0

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-24 05:31:13

我猜这是因为您调用的是delete,而不是afterEach中的stop。Delete将停止服务,并尝试完全删除类的实例。

就我个人而言,我不喜欢创建一个随后启动/停止的服务,因为您停止了并发测试的运行。我更喜欢的方法是为随机端口上的每个测试创建一个新的pact实例(为您这样做),然后在最后删除它。这样,每次都保证有一个新的实例。这个看起来是这样的:

代码语言:javascript
复制
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节点自动填充)。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47441891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档