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

如何正确调用Jest中setupFiles指定文件所需的函数?

解决Jest setupFiles中认证流程的参数传递问题

问题分析

你的代码存在两个核心问题,直接导致调用函数时提示未传入参数:

  1. requests.cjs导出错误:你直接执行post()并导出执行结果,而非导出post函数本身。这会让auth.cjs中require得到的是post函数无参数执行后的Promise,根本无法调用request.post方法。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 22:40:07