【免费下载链接】GPTSession2CPAandSub2API项目地址https://gitcode.com/gh_mirrors/gp/GPTSession2CPAandSub2API点击查看免费下载GPTSession2CPAandSub2API是一个纯前端的 ChatGPT session JSON 格式转换工具把 ChatGPT Web 登录 session 一键转换成 CPA、sub2api、Cockpit、9router、Codex、AxonHub、Codex-Manager 等多种可导入的 JSON。所有逻辑都内联在 docs/index.html 的script里没有独立的 JS 模块——这给单元测试出了个难题怎么在没有浏览器、没有测试框架的情况下验证转换逻辑本文带你拆解 tests/convert-session.test.js 的完整套路用Node 内置 vm 模块 手工假 DOM把 HTML 里的内联脚本抽出来跑起来并断言结果。一、为什么不用 Jest / Vitest而是裸跑 Node 这个项目的约束很苛刻单页工具核心逻辑全部内联在 docs/index.html 底部那段script中没有可 import 的模块不想引入任何依赖克隆下来node一跑就行想直接测试真实页面跑的那份代码而不是复制一份测试专用逻辑那样测的不是产品本身。所以作者选择了最轻量的方案零依赖 Node 内置模块。整个测试只用到 4 个内置模块模块用途node:vm在沙箱上下文里执行 HTML 内联脚本node:assert/strict严格断言node:fs读取docs/index.html源码node:path拼接文件路径对应源码见 tests/convert-session.test.js#L3-L6。二、第一步用正则把内联脚本从 HTML 里抽出来 页面结构是HTML 壳 底部一段内联脚本测试直接读源码并匹配const html fs.readFileSync(path.join(__dirname, .., docs, index.html), utf8); const match html.match(/script\s*([\s\S]*?)\s*\/script\s*\/body/); assert.ok(match, expected docs/index.html to contain one inline script);见 tests/convert-session.test.js#L52-L57。正则\/script\s*\/body锚定了body 前最后一个内联脚本正好是页面主逻辑所在即 docs/index.html#L778 开始、#L1758 结束的那段 IIFE。这一步保证了被测代码 用户浏览器里真实运行的代码不存在测试版与线上版分叉的问题。三、第二步造一个能骗过页面脚本的假 DOM 内联脚本一启动就会调用document.querySelector、addEventListener等一大串浏览器 API。测试没有引入 jsdom而是手工实现了一个最小化的假 DOMtests/convert-session.test.js#L8-L501通用假元素createFakeElement—— 每个元素只保留页面脚本真正会碰的属性和方法addEventListener(type, handler)把事件处理器记进listeners供测试稍后手动触发classList.add/remove/toggle用一个Set实现增删setAttribute、value、dataset、click()等基础字段。2假document对象#L64-L81—— 关键技巧是querySelector按选择器缓存同一实例querySelector(selector) { if (!elements.has(selector)) { elements.set(selector, createFakeElement(selector)); } return elements.get(selector); }这样页面脚本初始化时拿到的#session-input和测试后面往同一个 Map 里取的#session-input是同一个对象——测试才能写入输入框然后从输出框里读结果。同时querySelectorAll([data-format])会返回 7 个预制的格式按钮sub2api / cpa / cockpit / 9router / codex / axonhub / codexmanager对应页面 docs/index.html#L662-L668让测试能模拟点击某个输出格式按钮。3沙箱上下文补齐浏览器 API#L83-L103TextEncoder/TextDecoder解码 JWT 用、atob/btoa、console、setTimeout、navigator.clipboard.writeText存根、URL.createObjectURL下载按钮用返回blob:test……哪些 API 页面脚本用到了就补哪些缺一个都会在运行时报错天然帮你发现遗漏。四、第三步vm.runInNewContext 一键启动浏览器 准备工作做完后真正执行页面脚本只有一行tests/convert-session.test.js#L105vm.runInNewContext(match[1], context, { filename: docs/index.html });vm模块把这段脚本当作独立上下文里的顶层脚本执行脚本里的document、navigator解析到的是你伪造的对象而不是真的不存在Node 里本来就没有它们每个测试用例都会重新调用loadPageScript()得到一份全新的沙箱和全新的元素集合用例之间互不污染——这相当于每个用例都刷新一次页面。执行完页面脚本已经把事件监听器挂到了假元素上。测试通过dispatch()手动派发事件来模拟用户操作#L110-L113function dispatch(element, type) { assert.equal(typeof element.listeners[type], function, missing ${type} listener on ${element.selector}); element.listenerstype; }先断言监听器存在防止脚本静默没注册事件再触发input/click事件完整复现用户粘贴 JSON → 点击格式按钮 → 页面输出结果的操作链路。五、10 个用例验证的是转换正确性而不是页面长什么样 ✅有了沙箱测试就能聚焦业务本身。每个用例的模式高度统一loadPageScript()起一个新沙箱往#session-input塞一段伪造的 session JSONdispatch(input, input)触发转换JSON.parse(output.value)断言输出的关键字段。其中jwtWithPayload()辅助函数#L115-L121用base64url快速拼出一个形如header.payload.sig的假 JWT用来测试页面从 access token 的 exp 读过期时间这类逻辑。用例验证点sub2api 单账号过期时间expires_at精确取自 JWT 的exp且只写在账号级、不写到顶层sub2api 多账号各自过期批量输入时每个账号用自己的exp互不串味有 refreshToken 则省略过期字段可刷新账号不再输出expires_at/auto_pause_on_expired合成 id_token 可被 Codex 解析缺真实id_token时合成的 JWT 必须是完整 3 段且 claims 里 email、account_id 正确AxonHub 缺 refreshToken 用占位符写入__missing_refresh_token__并附说明字段last_refresh为过期时间前 1 小时AxonHub 保留真实 token有真实refreshToken/idToken时原样透传、不留占位标记Codex 原生 auth.json 结构auth_mode: chatgpt、OPENAI_API_KEY: null、refresh 缺失时留空串Codex 保留真实 token真实refresh_token、id_token、account_id全部保留Codex-Manager 缺 token 留空串空串避免被误判为可刷新账号meta.label用邮箱命名Codex-Manager 保留元数据workspace_id、chatgpt_account_id等元数据正确落到meta所有用例在文件末尾按序调用最后打印convert-session tests passed#L441-L451。六、如何自己跑一遍零依赖验证转换逻辑 克隆仓库后在项目根目录执行node tests/convert-session.test.js没有任何npm install10 个断言组全部通过即输出convert-session tests passed想扩展用例也很容易复制一个testXxx函数在input.value里造新的输入、在output.value里断言新期望末尾加一行调用即可——加一个用例 加一个纯函数心智负担极低。七、这套内联脚本测试法值得抄的作业 对于单个 HTML 文件 内联脚本形态的工具这个仓库给出了一个可复用的测试模板正则提取用带锚点的正则\/script\s*\/body稳定定位内联脚本测的就是线上代码最小假 DOM不用 jsdomquerySelector用 Map 缓存实现选择器 ↔ 实例双向可达沙箱执行vm.runInNewContext补齐document/navigator/TextEncoder等 API缺什么报什么天然暴露依赖事件驱动断言dispatch()手动触发input/click模拟真实用户操作路径每用例新沙箱loadPageScript()即刷新页面用例天然隔离。配合 README.md 里所有解析和转换都在浏览器本地完成不上传 token的定位这套零依赖测试既守住了单文件开箱即用的产品形态又给转换逻辑兜了一层自动化保障——新手读者完全可以照着 tests/convert-session.test.js 这个 400 多行的文件为自己的内联脚本页面复刻一套同款测试。赞分享【免费下载链接】GPTSession2CPAandSub2API项目地址https://gitcode.com/gh_mirrors/gp/GPTSession2CPAandSub2API点击查看免费下载相关推荐Reachability.swift单元测试策略如何验证网络状态切换逻辑Reachability.swift单元测试策略如何验证网络状态切换逻辑 你是否在开发iOS应用时遇到过网络状态判断不准确的问题用户反馈明明有网却提示连接网络LeRobot视觉增强实战如何将机器人视觉系统的泛化能力提升40%LeRobot视觉增强实战如何将机器人视觉系统的泛化能力提升40% 在工业机器人部署的实践中超过90%的视觉系统失败案例源于环境变化带来的挑战——光照突变、人工智能机器学习深度学习机器人具身智能强化学习深蓝词库转换测试体系揭秘xUnit 单元测试 集成测试如何保证 50 格式转换零差错深蓝词库转换测试体系揭秘xUnit 单元测试 集成测试如何保证 50 格式转换零差错 深蓝词库转换IME WL Converter是一款开源免费的输桌面应用CLI开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考