【问题标题】:Nock does not intercept requests - Error: getaddrinfo ENOTFOUNDNock 不拦截请求 - 错误:getaddrinfo ENOTFOUND
【发布时间】:2019-09-19 21:04:08
【问题描述】:

让我先解释一下一切是如何设置的。

  • 测试使用 Jest 运行。
  • 我有一个带有以下行的 jest.config.json:
    • "globalSetup": "<rootDir>/__tests__/setup.js",
  • setup.js我有以下内容:

如您所见,我将伪造的 URL 放在环境变量 AMA_API 中。 之后,我需要./nock.ts 并记录Nock init done 行。这个文件的其余内容似乎与我无关。

module.exports = async function() {
    console.log('[JEST SETUP] setting env var')
    process.env.AMA_API = 'http://fake.local'

    require('tsconfig-paths').register()
    require('ts-node').register({
        lazy: true,
        fast: true,
        project: 'tsconfig.json'
    })

    require('./nock.ts')
    console.log('Nock init done.')
    const connections = await require('src/db/connection.ts').initConnection()
    await require('./clearDb.ts').clearDB()
    await require('./initDb.ts').initializeDB()
    await Promise.all(connections.map(con => con.close()))
    console.log(`Connection setup complete [${connections.length} Connection${connections.length > 1 ? 's' : ''}]`)
    return true
};
  • nock.ts,我有以下内容:
import * as nock from 'nock';

const FAKE_ANALYST_USER_CREATED = {
   ... (some large object)
}

console.log('NOCK URL ' + process.env.AMA_API);

nock(process.env.AMA_API)
  .persist()
  .log(console.log)
  .post('api/analyst/create-analyst-user')
  .reply(200, FAKE_ANALYST_USER_CREATED)

  • 这就是我所有的 nock 设置。然后在teams.controller.spec.ts,我有如下测试:
describe('Team Endpoint', () => {
    let connections: Connection[];

    beforeAll(async () => {
        connections = await initConnection();
    });

    afterAll(async () => {
        await Promise.all(connections.map(con => con.close()));
        console.log('connection closed');
        return true;
    });

    describe('Team', () => {
        test.only('POST / should return [200 - OK] and create a new team', async () => {
            const newTeam = {
                ...
            };

            let response = await request(app)
                .post('/')
                .set('Authorization', adminUserToken())
                .send(newTeam);

            expect(response.status).toBe(201);
            expect(response.body).toHaveProperty('name', newTeam.name);
            expect(response.body).toHaveProperty('slug', newTeam.slug);
            expect(response.body).toHaveProperty('apiKey');
            expect(response.body.apiKey).toBeDefined();

            response = await request(app)
                .delete(`/${response.body.id}`)
                .set('Authorization', adminUserToken())
            expect(response.status).toBe(200);
        });
    });
});
  • 那么最后,这个测试会触发teams.controller.ts中的一个函数,内容如下:
import { Request, Response } from 'express';
import * as jwt from 'jsonwebtoken';
import * as rp from 'request-promise';
import { config } from 'src/config';
import { Brackets } from 'typeorm/query-builder/Brackets';
import { isUUID } from 'validator';
import { withConnection, withTransaction } from '../../db/connection';
import { Team } from '../../models/team';

/**
 * Create a new user
 */
export async function create(req: Request, res: Response) {
  const result = await withTransaction(async em => {
    const teamRepository = em.getRepository(Team)


    ... (irrelevant code)


    console.log('AMA URL ' + process.env.AMA_API)

    const response = await rp({
      uri: `${process.env.AMA_API}/api/analyst/create-analyst-user`,
      method: 'POST',
      json: true,
      headers: {
        'accept': 'application/json',
        'content-type': 'application/json',
        'authorization': 'Bearer ' + jwt.sign({
          id: -1,
          role: 'admin',
          team: '*',
        },
        config.secrets.session,
        {
          expiresIn: 60 * 60
        })
      },
      body: {username: newTeam.name, id: newTeam.id}
    });

    return response

  })

  if (result) {
    return res.status(201).send(result)
  }
}

因此,所有这些都解决了.. 运行测试时会到达所有设置代码(基于我看到的控制台输出)。 但是,当我运行测试时,最后一个代码块中的请求没有被拦截,我得到以下输出:

Determining test suites to run...[JEST SETUP] setting env var
NOCK URL http://fake.local
Nock init done.
Starting server for profile test...
[Team] Adding initial teams
Connection setup complete [1 Connection]

 RUNS  src/api/teams/teams.controller.spec.ts
 RUNS  __tests__/server.spec.ts

Test Suites: 0 of 2 total
Tests:       0 total
Snapshots:   0 total
 PASS  __tests__/server.spec.ts
  ● Console    console.log __tests__/jest.js:1      [JEST SETUP] setting timeout to 10s
 FAIL  src/api/teams/teams.controller.spec.ts (6.488s)  ● Console

    console.log __tests__/jest.js:1
      [JEST SETUP] setting timeout to 10s    console.log src/config/index.ts:8
      Starting server for profile test...    console.log src/api/teams/teams.controller.ts:90
      AMA URL http://fake.local    console.log src/api/teams/teams.controller.spec.ts:16
      connection closed
  ● Team Endpoint › Team › POST / should return [200 - OK] and create a new 
team

    RequestError: Error: getaddrinfo ENOTFOUND fake.local fake.local:80

      at new RequestError (node_modules/request-promise/node_modules/request
-promise-core/lib/errors.js:14:15)
      at Request.plumbing.callback (node_modules/request-promise/node_module
s/request-promise-core/lib/plumbing.js:87:29)
      at Request.RP$callback [as _callback] (node_modules/request-promise/no
de_modules/request-promise-core/lib/plumbing.js:46:31)
      at self.callback (node_modules/request/request.js:185:22)
      at Request.Object.<anonymous>.Request.onRequestError (node_modules/req
uest/request.js:881:8)

我已经花了几个小时试图找出这里出了什么问题……但没有成功。任何帮助将不胜感激。

【问题讨论】:

  • 您尝试过.post('/api/analyst/create-analyst-user')(添加前置/)吗?
  • @tagyoureit ,是的,试过了。它没有用。我也试过 .post(\.*\) ,它应该拦截所有路径,这也不起作用。

标签: node.js typescript express jestjs nock


【解决方案1】:

如果有人遇到同样的问题。将 nock 初始化移动到 beforeall 为我修复了它。

【讨论】:

  • 你能解释一下你到底搬了什么吗?这部分:nock(process.env.AMA_API) ??
【解决方案2】:

现在是使用Nock Recorder 的好时机。它会记录您的 HTTP 调用,并让您确切了解 Nock 与请求不匹配的原因。

在您的teams.controller.ts 中试试这个:

import { Request, Response } from 'express';
import * as jwt from 'jsonwebtoken';
import * as rp from 'request-promise';
import { config } from 'src/config';
import { Brackets } from 'typeorm/query-builder/Brackets';
import { isUUID } from 'validator';
import { withConnection, withTransaction } from '../../db/connection';
import { Team } from '../../models/team';
const nock = require('nock')  // add Nock
nock.recorder.rec({
    output_objects: true,
  })  // Setup Nock to Record

/**
 * Create a new user
 */
export async function create(req: Request, res: Response) {
  const result = await withTransaction(async em => {
    const teamRepository = em.getRepository(Team)


    ... (irrelevant code)


    console.log('AMA URL ' + process.env.AMA_API)

    const response = await rp({
      uri: `${process.env.AMA_API}/api/analyst/create-analyst-user`,
      method: 'POST',
      json: true,
      headers: {
        'accept': 'application/json',
        'content-type': 'application/json',
        'authorization': 'Bearer ' + jwt.sign({
          id: -1,
          role: 'admin',
          team: '*',
        },
        config.secrets.session,
        {
          expiresIn: 60 * 60
        })
      },
      body: {username: newTeam.name, id: newTeam.id}
    });

    nock.restore()  // stop nock recording
    const nockCalls = nock.recorder.play() // "play" the recording into a variable
    console.log(`Nock Captured Calls: \n${JSON.stringify(nockCalls,null,2)}`) // inspect calls that Nock recorder

    return response
  })

  if (result) {
    return res.status(201).send(result)
  }
}

【讨论】:

    猜你喜欢
    • 2019-07-14
    • 2022-11-04
    • 1970-01-01
    • 2019-01-06
    • 2016-10-05
    • 2021-08-10
    • 1970-01-01
    • 2017-10-16
    • 2018-04-02
    相关资源
    最近更新 更多