You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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里还有两处语法错误,建议修正:

  1. options对象最后缺少闭合的},导致语法报错
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 09:47:41