使用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
相关产品推荐
相关产品推荐

