Appearance
修复购物车负金额:先复现,再改代码
作者已运行 · 尚无独立读者复现
本案例由本站执行 Agent 在当前 Codex 桌面会话中编写和运行,不是从生产客户项目提取的故障。验证的是源码、测试及修复;下方供读者使用的 Prompt 为过程整理版,尚未由独立读者逐字执行。
1. 场景价值与交付产物预览
适合已经能打开 Codex 工作目录、能运行 Node.js 命令的读者。重点是检查 AI 修复是否真的有效。
输入是一段虚构的购物车代码:金额以整数分计价,优惠不能让应付金额小于零。输出是修复后的 cart.mjs、未被改动的测试,以及可解释的 diff。
| 输入 | 原代码 | 修复后 |
|---|---|---|
商品 1000 分,优惠 1500 分 | -500 分 | 0 分 |
空购物车,优惠 100 分 | -100 分 | 0 分 |
商品 2000 分,优惠 300 分 | 1700 分 | 1700 分 |
这是教学练习,不是可直接接入支付系统的金额库。输入限定为合法非负整数,不覆盖校验、退款、税费与运费。
2. 前置准备与环境配置
作者运行环境:macOS 26.5.1、arm64、Node.js 26.8.1,Codex 当前桌面会话。未验证其他系统和客户端组合;不要求安装 MCP 或全局 Skill。耗时未测量。
创建一个空目录,将以下三个链接的文件保存进去,保持文件名:
若浏览器直接显示文本,使用“另存为”保存为对应文件名,不要保存成网页。已安装 Node.js 的读者可先检查环境,再在该目录执行:
bash
node --version
node --test cart.test.mjs预期是 3 个通过、2 个失败,失败值分别为 -500 和 -100,预期均为 0。如果一开始全部通过,确认下载的是原始文件,而不是下面的参考答案。
3. 核心配置文件
不需要额外配置,也不需要 package.json。使用 Node.js 自带测试运行器;三个输入文件应位于同一目录。不要把参考答案替换进输入后再让 Codex“寻找问题”。
4. Prompt 与执行过程
在 Codex 中打开刚才的目录,使用以下整理后的练习 Prompt:
text
请读取 TASK.md 和购物车源码,先运行 node --test cart.test.mjs 复现问题。
解释失败原因,仅修改 cart.mjs 修复优惠导致负金额的问题,不修改测试。
重新运行全部测试,输出实际测试结果、修复 diff 和没有覆盖的边界。作者实际过程是:在网站整改任务中先编写题目和固定测试,运行看到两个失败;随后将扣减结果限制为不小于零;最后在两个新建临时目录中分别重复原始失败与修复后通过检查。没有调用第二个 Agent,也没有把隔离复跑算成独立读者试读。
关键修复为:
diff
- return items.reduce((sum, item) => sum + item.priceCents * item.quantity, 0) - discountCents;
+ const subtotal = items.reduce((sum, item) => sum + item.priceCents * item.quantity, 0);
+ return Math.max(0, subtotal - discountCents);这项修复对应题目明确规定的金额下限。真实业务若有负余额、退款等需求,需要另行定义规则,不能机械套用。
5. 排障与验收要求
验收不能只看 Codex 说“修好了”。你应再次运行测试,看到 5 个通过、0 个失败,并确认 cart.test.mjs 没有变化。
- 找不到文件:先确认终端当前目录和文件扩展名,避免保存成
.txt。 - 运行器不支持:核对 Node.js 版本;本文没有验证所有历史版本。
- Codex 修改测试让它通过:拒绝这次结果,恢复下载的固定测试后重新修复源码。
- 全部通过仍不代表生产可用:本题未覆盖非法输入、整数溢出、多币种、并发或支付状态。
6. 示例源码与产物资源
- 修复后参考实现:与原始输入区分保存;需要运行时将其命名为
cart.mjs。 - 脱敏验证摘要:关联样例内容哈希,列出实际运行结果和验证范围。
- Node.js 测试运行器文档:命令依据,官方资料核对与作者执行是不同证据。
- 内容标准与反馈格式:欢迎记录实际复现结果;当前独立读者样本为
0。