我正在测试一个脚本,其中一个函数发出http请求,然后在另一个函数中调用。
第一个功能是:
export function getFeedData (sub) {
if (getFeedId(sub) === 2) {
return axios.get('http://localhost:4000').then((data) => JSON.parse(data));
}
}
第二个是:
export function isDelay (sub, stop) {
return getFeedData(sub).then((data) => {
return data.entity.filter((entityObj) => {
return entityObj.stop_time_update !== undefined;
});
}).then((newData) => {
console.log(newData);
}).catch((err) => {
console.log(err);
});
}
他们有两个不同功能的原因是第二个最终会更长,我想把所有内容分开,以简化并使我的代码更具说明性。
这些功能的测试目前看起来像这样:
import express from 'express';
import { getFeedId, getFeedData, reverseStop, isDelay } from '../mocks/apiMock';
const app = express();
app.use(express.static('../mocks/MockData.json'));
it('returns json data', (done) => {
app.listen(4000, function () {
expect.assertions(2);
return getFeedData('L').then((data) => {
expect(data).toBeDefined();
expect(data.header.gtfs_realtime_version).toBe('1.0');
});
});
done();
});
it('returns either the delay or time until the next train' , (done) => {
app.listen(4000, function () {
isDelay('L', 'Lorimer St');
});
done();
});
第二次测试没有运行,因为它试图收听已经占用的端口。
我想到的解决方案是将app.listen()
0
作为其第一个参数传递,以便侦听随机端口。但是,我不知道如何获得请求特定端口的axios请求。有没有办法做到这一点?或者也许是我问题的更好解决方案?请善待,因为这是我第一次真正独立地开始创建节点/快速服务器,我在发布这里之前尽我所能来研究问题。
答案 0 :(得分:0)
您应仅使用一个特定的HTTP服务器端口,例如:4000
。
然后,您应该像这样设置HTTP服务器:
const port = 4000;
let server
beforeAll((done) => {
server = app.listen(port, () => {
done();
})
})
afterAll((done) => {
server && server.close(done)
})
// Your test suites and test cases.
然后您可以测试您的功能,它们向同一端点发出HTTP请求,例如http://localhost:4000
。