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

使用Jest测试JS函数遇openOrderPage未定义错误求助

解决Jest测试中的ReferenceError及测试逻辑问题

看起来你碰到了两个核心问题:一是测试文件找不到openOrderPage函数导致的ReferenceError,二是测试期望和函数实际行为不匹配的问题。我来一步步帮你搞定:

1. 先搞定ReferenceError: openOrderPage is not defined

这个错误本质是你的测试文件没正确导入目标函数。你需要在js/__tests__/background.js里导入background.js中的openOrderPage:

步骤1:确保background.js导出函数

打开js/background.js,给函数加上导出(根据你的模块系统选一种):

function openOrderPage(orderURL) { 
  window.open(orderURL, '_blank'); 
}

// 如果是CommonJS(Node.js/大多数旧项目)
module.exports = { openOrderPage };

// 如果是ES模块(用import/export的项目)
// export { openOrderPage };

步骤2:在测试文件中导入函数

在js/__tests__/background.js顶部添加导入语句:

// CommonJS导入
const { openOrderPage } = require('../background.js');

// ES模块导入
// import { openOrderPage } from '../background.js';

2. 修正测试逻辑:让测试和函数行为对齐

你当前的测试期望openOrderPage调用getOrderDetails,但实际的openOrderPage里根本没这个调用——就算解决了导入问题,测试还是会失败。这里分两种场景处理:

场景A:你确实希望openOrderPage调用getOrderDetails

如果这是旧代码的预期行为(可能你漏写了函数逻辑),先更新js/background.js的实现:

function getOrderDetails() {
  // 这里放你原有的getOrderDetails逻辑
}

function openOrderPage(orderURL) { 
  getOrderDetails(); // 添加上这个调用
  window.open(orderURL, '_blank'); 
}

// 记得导出两个函数,方便测试mock
module.exports = { openOrderPage, getOrderDetails };

然后修改测试文件,正确mockgetOrderDetails(不能在测试里定义一个局部的jest.fn(),因为那和函数里调用的不是同一个):

const { openOrderPage, getOrderDetails } = require('../background.js');

// 用jest.mock来mock模块里的getOrderDetails函数
jest.mock('../background.js', () => {
  const originalModule = jest.requireActual('../background.js');
  return {
    ...originalModule,
    getOrderDetails: jest.fn(),
  };
});

test('should call getOrderDetails', () => { 
  // 注意:原函数只接受orderURL一个参数,你的测试传了三个,这里要匹配
  openOrderPage('https://test-order-url.com');
  expect(getOrderDetails).toBeCalled(); 
});

场景B:测试期望写错了(openOrderPage不需要调用getOrderDetails)

如果你的openOrderPage本来就不需要调用getOrderDetails,那应该调整测试逻辑,比如测试它是否正确调用了window.open:

const { openOrderPage } = require('../background.js');

test('should open order page in new tab', () => { 
  // mock全局的window.open
  global.open = jest.fn();
  
  const testOrderURL = 'https://example.com/order-123';
  openOrderPage(testOrderURL);
  
  // 验证window.open是否用正确的参数调用
  expect(global.open).toBeCalledWith(testOrderURL, '_blank'); 
});

另外提醒一句:你测试里调用openOrderPage(request, {}, {}),但原函数只接受一个orderURL参数,参数不匹配也可能导致后续问题,记得调整调用参数和函数定义一致。

内容的提问来源于stack exchange,提问作者Nuruddin Iminokhunov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:24:27