如何正确调用Jest中setupFiles指定文件所需的函数?
解决Jest setupFiles中认证流程的参数传递问题
问题分析
你的代码存在两个核心问题,直接导致调用函数时提示未传入参数:
- requests.cjs导出错误:你直接执行
post()并导出执行结果,而非导出post函数本身。这会让auth.cjs中require得到的是post函数无参数执行后的Promise,根本无法调用request.post方法。 - post函数内部逻辑错误:
- 直接给
body.headers赋值,若body未传入会抛出TypeError - 使用
new URLSearchParams({ body })会把原body包装成{body: 原body}的结构,不符合表单提交的格式要求
- 直接给
修复步骤
1. 修正requests.cjs的导出与函数逻辑
async function post(url, body = {}, headers = {}) { // 合并headers,避免直接修改传入的body对象 const requestHeaders = { 'Content-Type': 'application/x-www-form-urlencoded', ...headers }; // 直接将body传入URLSearchParams,无需额外包装 const postConstants = { method: 'POST', headers: requestHeaders, body: new URLSearchParams(body) }; return await fetch(url, postConstants); } // 导出包含post方法的对象,匹配auth.cjs中的调用方式 module.exports = { post };
2. 修正auth.cjs中的变量定义与认证执行
注意你代码中canary、ctx、sessionId、sft均未定义,需要先获取或赋值这些变量,同时要主动调用认证函数:
const request = require('./requests.cjs'); const microsoftLoginUrl = 'https://login.microsoftonline.com/'; async function getAuthCookie() { // 先定义或从前置请求/环境变量中获取这些必填变量 const canary = '实际值'; const ctx = '实际值'; const sessionId = '实际值'; const sft = '实际值'; const loginResponse = await request.post( `${microsoftLoginUrl}xxxxx/login`, { login: 'xxxx', passwd: 'xxxxx', canary, ctx, hpgRequestId: sessionId, flowToken: sft, } // 若使用requests.cjs中的默认headers,此处可省略第三个参数 ); // 后续从loginResponse中提取并处理认证cookie的逻辑 // ... } // 主动调用认证函数,否则setupFiles配置不会触发认证流程 getAuthCookie().catch(err => console.error('认证失败:', err));
3. 确认jest.config.cjs配置有效性
你的setupFiles路径配置是正确的,确保文件路径与项目结构匹配即可:
module.exports = { setupFiles: ['./tests/lib/auth.cjs'], // 其他Jest配置项 };
内容的提问来源于stack exchange,提问作者Adrian Alan
相关产品推荐
相关产品推荐

