集成测试中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=")(?!\s*$).+(?=")/g); // 后续测试逻辑... });
方案2:改用setupFilesAfterEnv自动执行初始化
如果希望每个测试前自动完成初始化,无需在测试文件中手动调用:
- 修改
jest.config.cjs:
const jestConfig = { testMatch: ['**/tests/*.cjs'], setupFilesAfterEnv: ['./tests/lib/auth.cjs'], // 替换原setupFiles globals: { baseUrl: 'https://someUrl.com/', } }; module.exports = jestConfig;
- 修改
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
相关产品推荐
相关产品推荐

