具有 nock.back 记录模式的超级测试模拟不起作用

supertest mock with nock.back record mode not working

我有一个 nodejs 服务,当调用它的端点时,会对服务 B 进行 http 调用。我正在向我的服务添加验收测试以测试集成。

dryrun 模式下使用 nock.back 可以完美地工作,但是当我将模式设置为 record 时,第二次测试不起作用我 运行 它虽然夹具已正确生成。

我需要 运行 在 record 模式下进行测试,因为在某些环境中测试 运行,服务 B 将无法访问。

这是我的测试:

nock.back.setMode('record');
nock.back.fixtures = path.join(__dirname, '..', 'fixtures');

it('validates the contract for at least one hotel', (done) => {
  return nock
    .back('myfixture.json', defaultOptions)
    .then(({ nockDone }) =>
      request(app)
        .get('/myapi/route')
        .then((res) => {
          expect(res.status).toBe(200);
          console.log(res.body);
          done();
        })
        .then(nockDone),
    )
    .then();
});

当运行之前没有生成myfixture.json时,测试通过并正确生成fixture。下次我 运行 测试(那里有夹具)时,测试失败:

NetConnectNotAllowedError: Nock: Not allow net connect for "127.0.0.1:52027/myapi/route

另一方面,如果我设置 dryrun 模式而不是 record 模式,测试总是通过并且响应的主体是正确的,所以对服务 B 的调用是做得好。

这里的问题是第二次使用已创建的固定装置运行测试时,所有未出现在固定装置文件中的 http 请求都被拒绝。

此拒绝还包括 supertest 对应用程序执行的实际内部请求,因此要解决此问题,必须允许本地主机,例如:

nock.enableNetConnect(/(localhost|127\.0\.0\.1)/);