【问题标题】:Is it possible to nock an external service call inside a route是否可以在路由内搭接外部服务调用
【发布时间】:2019-05-20 14:05:19
【问题描述】:

我正在尝试测试一个调用外部服务的 rest api。

server.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);

utils/redirection.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不拦截请求,服务器调用外部api。 nock 可以拦截深度 HTTP 请求吗?或者我错过了我的代码中的某些内容?有什么建议可以解决这个问题吗?

【问题讨论】:

    标签: javascript node.js nock


    【解决方案1】:

    如果没有运行示例,很难判断出了什么问题。但我可以说你可以在这里改变一些东西(我今天也在和 Nock 作斗争)。

    首先,由于您正在处理重定向,请查看此评论。这对我有用:https://github.com/nock/nock/issues/147#issuecomment-71433752

    第二,注意:指定headers的语法错误,这个是正确的:

    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
    

    server.js

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

    这样您就可以将您的 app.js 导入到您的测试套件中,而无需监听部分,这将避免在运行新测试时出现网络端口问题。

    如果这有帮助,请告诉我...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      相关资源
      最近更新 更多