是否可以在路线内拨打外部服务电话
Is it possible to nock an external service call inside a route
我正在尝试测试调用外部服务的 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 请求?或者我在我的代码中遗漏了什么?有什么建议可以解决这个问题吗?
没有 运行ning 示例,很难说出哪里出了问题。但我可以看出您可以在这里更改一些内容(我今天也在为 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 导入到你的测试套件中而无需监听部分,这将避免在新测试 运行.
如果有帮助请告诉我...
我正在尝试测试调用外部服务的 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 请求?或者我在我的代码中遗漏了什么?有什么建议可以解决这个问题吗?
没有 运行ning 示例,很难说出哪里出了问题。但我可以看出您可以在这里更改一些内容(我今天也在为 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 导入到你的测试套件中而无需监听部分,这将避免在新测试 运行.
如果有帮助请告诉我...