在Node.js项目开发中,我们经常会封装REST GET请求函数来简化接口调用逻辑,这类函数的稳定性直接影响业务接口的可用性,因此需要通过单元测试来验证其行为是否符合预期。Jest作为目前主流的JavaScript测试框架,提供了完善的Mock能力和断言方法,非常适合用来测试这类网络请求相关的函数。

测试前的环境准备
首先需要确保项目已经安装了必要的依赖,如果你还没初始化项目,可以先执行以下命令:
# 初始化Node.js项目 npm init -y # 安装Jest和用于发送HTTP请求的axios npm install jest axios --save-dev
然后在package.json中添加测试脚本:
{
"scripts": {
"test": "jest"
}
}待测试的GET请求封装函数
我们先定义一个简单的GET请求封装函数,后续的所有测试都会围绕这个函数展开,函数代码如下:
// request.js
const axios = require('axios');
/**
* 封装GET请求函数
* @param {string} url - 请求地址
* @param {Object} params - 请求参数
* @param {Object} config - 额外的axios配置
* @returns {Promise} 请求Promise
*/
const getRequest = (url, params = {}, config = {}) => {
return axios.get(url, {
params,
...config
});
};
module.exports = getRequest;编写测试用例
模拟axios模块
测试网络请求函数时,我们不应该真的发送请求到外部服务,否则测试会依赖网络环境,还可能影响外部接口。因此需要使用Jest的Mock功能模拟axios模块:
// request.test.js
// 模拟axios模块
jest.mock('axios');
// 导入被测试的函数和模拟后的axios
const getRequest = require('./request');
const axios = require('axios');
// 设置axios.get的默认Mock返回值
axios.get.mockResolvedValue({ data: { code: 200, message: 'success' } });基础功能测试
我们首先测试函数是否能正确调用axios的get方法,并且传入的参数符合预期:
describe('GET请求封装函数测试', () => {
afterEach(() => {
// 每个测试用例执行后清除Mock的调用记录
jest.clearAllMocks();
});
test('调用时应该执行axios.get方法并传入正确参数', async () => {
const testUrl = 'https://ipipp.com/api/user';
const testParams = { id: 1 };
const testConfig = { timeout: 5000 };
await getRequest(testUrl, testParams, testConfig);
// 断言axios.get被调用了一次
expect(axios.get).toHaveBeenCalledTimes(1);
// 断言传入的参数正确
expect(axios.get).toHaveBeenCalledWith(testUrl, {
params: testParams,
...testConfig
});
});
});请求成功场景测试
接下来测试函数返回结果是否符合预期,当请求成功时,函数应该返回axios的响应数据:
test('请求成功时应该返回正确的响应数据', async () => {
const mockResponse = { data: { code: 200, list: [{ name: '张三' }] } };
// 设置本次Mock的返回值
axios.get.mockResolvedValue(mockResponse);
const result = await getRequest('https://ipipp.com/api/list');
expect(result).toEqual(mockResponse);
});请求失败场景测试
还要测试请求失败时的行为,比如网络错误或者接口返回错误码的情况:
test('请求失败时应该抛出错误', async () => {
const mockError = new Error('Network Error');
axios.get.mockRejectedValue(mockError);
// 断言函数调用后会抛出对应的错误
await expect(getRequest('https://ipipp.com/api/error')).rejects.toThrow('Network Error');
});执行测试与结果查看
完成测试用例编写后,在项目根目录执行npm test命令就可以运行测试,Jest会自动查找所有.test.js或者.spec.js结尾的文件执行。如果所有测试通过,会显示绿色的通过提示,如果有失败的用例,会展示具体的错误信息和断言失败的原因,方便我们定位问题。
测试实践建议
- 尽量覆盖更多场景,比如参数为空、参数类型错误、超时配置生效等边缘情况
- Mock函数的返回值要尽量模拟真实接口的响应结构,避免测试和实际运行结果差异过大
- 不要在测试用例中写过于复杂的逻辑,每个用例只验证一个明确的行为点
- 定期运行测试,在修改封装函数逻辑后第一时间验证是否影响原有功能
JestNode.jsREST_GET请求封装函数单元测试修改时间:2026-06-05 02:36:27