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

集成测试中Jest因未定义全局变量抛出错误

解决方案

问题根源

  • 初始化逻辑未执行:你只在auth.cjs中定义了getReqVerificationValues函数,但没有调用它,global.createScriptDom从未被赋值,自然不是函数。
  • 异步逻辑未处理:getReqVerificationValues是异步函数,即使调用了,也需要等待它执行完成,否则global.createScriptDom仍处于未初始化状态。

修复方案

方案1:在测试文件中手动调用初始化函数

修改scripts.test.cjs的beforeEach为异步函数,先完成DOM初始化再使用全局变量:

const { getReqVerificationValues } = require('./lib/auth.cjs');

beforeEach(async () => {
  // 先等待初始化完成
  await getReqVerificationValues();
  const prescriberIdList = global
    .createScriptDom('[id=PrescriberId]')
    .children()
    .match(/(?<=option value=&quot;)(?!\s*$).+(?=&quot;)/g);
  // 后续测试逻辑...
});

方案2:改用setupFilesAfterEnv自动执行初始化

如果希望每个测试前自动完成初始化,无需在测试文件中手动调用:

  1. 修改jest.config.cjs:
const jestConfig = {
  testMatch: ['**/tests/*.cjs'],
  setupFilesAfterEnv: ['./tests/lib/auth.cjs'], // 替换原setupFiles
  globals: {
    baseUrl: 'https://someUrl.com/',
  }
};

module.exports = jestConfig;
  1. 修改auth.cjs,使用Jest钩子执行异步初始化:
const cheerio = require('cheerio');
// 引入你的fetch处理程序
const { get } = require('./path-to-your-fetch-handler.cjs');

async function getReqVerificationValues() {
  const getCreateScriptScreen = await get('someUri');
  expect(getCreateScriptScreen.status).toBe(200);
  const getCreateScriptScreenText = await getCreateScriptScreen.text();
  global.createScriptDom = cheerio.load(getCreateScriptScreenText);
}

// 在每个测试前自动执行初始化
beforeEach(async () => {
  await getReqVerificationValues();
});

module.exports = { getAuthCookie, getReqVerificationValues };

额外检查

确认getCreateScriptScreenText是有效的HTML字符串,如果API返回的内容异常,cheerio.load()可能无法返回预期的DOM操作函数,导致报错。


内容的提问来源于stack exchange,提问作者Adrian Alan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 20:25:01