Можно ли отключить вызов внешней службы внутри маршрута

Я пытаюсь протестировать API отдыха, который вызывает внешнюю службу.

сервер.js:

const express = require('express');
const app = express();
const router = express.Router();
const redirectUrl = require('../utils/redirection')

let baseUrl = 'myUrl';
let externalUrl = 'externalUrl';

router.get('/redirect', async (req, res) => {

  const { productName } = req.query;

  baseUrl = baseUrl + '/' + productName;
  externalUrl = externalUrl + '/' + productName;
  await redirectUrl(res)(timeOut, externalUrl, baseUrl)

})
app.use(router);

app.listen(3000);

утилиты/перенаправление.js:

edirectUrl = res => (timeOut, url, redirectUrl) => {
return new Promise((resolve, reject) => {
let cleared = false;

const timer = setTimeout(() => {
  cleared = true;
  return resolve(res.redirect(302, redirectUrl));
}, timeout);


return fetch(url)
  .then(
    response => {
      if (!cleared) {
        clearTimeout(timer);
        const {location} = response.headers;
        return resolve(res.redirect(302, location));
      }

      return null;
    })
  .catch(err => {
    if (!cleared) {
      clearTimeout(timer);
      return reject(err);
    }
  });


 });
}

test.js:

const requrest = require('request');
const chai = require('chai');
const server = require('../server/server');
const { expect } = chai;
describe('My test', () => {
  it('should redirects to the suitable page', () => {

   nock('url/to/external/service')
   .get('/${productName}')
   .reply(302, {
      headers: {
        location: 'this the page location'
   }})       

    const { status, headers } = request(app).get('/redirect')
    expect(status).to.equal(302);
    expect(headers.location).to.not.equal(0);

  })
})

Когда я выполняю тест, request запускает вызов API. Затем внутрь позвонили redirectUrl. Но nock не перехватывает запрос и сервер вызывает внешний апи. Может ли nock перехватить глубинный HTTP-запрос? или я что-то пропустил в своем коде? Есть ли какие-либо предложения, чтобы решить эту проблему?


person Slim    schedule 20.05.2019    source источник


Ответы (1)


Без работающего примера трудно сказать, что происходит не так. Но я могу сказать, что здесь есть несколько вещей, которые вы можете изменить (сегодня я также боролся с Ноком).

Во-первых, поскольку вы имеете дело с редиректами, взгляните на этот комментарий. Это сработало для меня: https://github.com/nock/nock/issues/147#issuecomment-71433752

Во-вторых, обратите внимание: синтаксис для указания заголовков неправильный, вот правильный:

nock('url/to/external/service')
   .get('/${productName}')
   .reply(302, 'whatever you want', {
      location: 'http://the.other.page.location'
   })

Третье: разделите файл server.js на два: server.js и app.js.

app.js

const app = express()
...
module.exports = app

сервер.js

const app = require('./path/to/app.js')
...
app.listen(3000)

Таким образом, вы можете импортировать свой app.js в свой набор тестов без части прослушивания, что позволит избежать проблем с сетевыми портами при запуске новых тестов.

Дайте мне знать, если это помогло...

person Matheus Dal'Pizzol    schedule 20.05.2019