使用Jest单元测试框架模拟request-promise的POST方法时出现TypeError: rp is not a function错误,模拟方式是否正确?
解决Jest模拟request-promise时出现TypeError: rp is not a function的问题
你的模拟方式不正确,这也是导致报错的核心原因。咱们来一步步拆解问题:
错误原因分析
你的业务代码a.js里是直接把rp当作函数调用的:
let response = await rp(options);
但你在测试代码里却把request-promise模拟成了一个包含post方法的对象:
jest.mock('request-promise', () => ({ post: jest.fn() }));
这就导致业务代码执行rp(options)时,rp是一个对象而非函数,自然抛出TypeError: rp is not a function。
正确的模拟方式
因为业务代码使用的是request-promise的默认导出函数形式,所以我们需要把默认导出模拟成一个jest函数,而不是带post属性的对象。
方案1:基础模拟(匹配业务代码的调用方式)
修改你的测试文件a.spec.ts:
// 把request-promise的默认导出模拟成jest函数 jest.mock('request-promise', () => jest.fn()); const rp = require('request-promise'); // 在测试用例中设置模拟返回值 test('测试abc函数', async () => { // 注意:业务代码里会对response做JSON.parse,所以要返回字符串格式的模拟数据 rp.mockResolvedValue(JSON.stringify({ status: 'success', data: {} })); // 这里执行你的abc函数并添加断言逻辑 // 比如调用abc后,断言rp被调用过,或者断言返回结果符合预期 });
方案2:兼容两种调用方式(如果业务里同时用到rp()和rp.post())
如果你的业务代码里既有直接调用rp(options),又有使用rp.post(options)的场景,可以这样模拟:
jest.mock('request-promise', () => { const mockRp = jest.fn(); // 同时模拟post方法 mockRp.post = jest.fn(); return mockRp; }); const rp = require('request-promise'); // 在测试用例中分别设置返回值 test('测试abc函数', async () => { rp.mockResolvedValue(JSON.stringify({})); // 如果需要测试rp.post的场景,可以设置rp.post.mockResolvedValue(...) });
额外提示:业务代码的小问题
你的a.js里还有两处语法错误,建议修正:
options对象最后缺少闭合的},导致语法报错data变量未定义,需要补充定义(比如const data = req.body;)
修正后的业务代码片段:
const rp = require('request-promise'); async abc(req, res){ const data = req.body; // 补充data的定义 const options = { port: 8888, body: data, url: 'http://url', method: 'POST', headers: { 'Content-Type': 'application/json' } }; // 补充闭合的} let response = await rp(options); console.log("rrreess", response); response = JSON.parse(response); }
内容的提问来源于stack exchange,提问作者Subburaj
相关产品推荐
相关产品推荐

