Skip to content

修复购物车负金额:先复现,再改代码

作者已运行 · 尚无独立读者复现

本案例由本站执行 Agent 在当前 Codex 桌面会话中编写和运行,不是从生产客户项目提取的故障。验证的是源码、测试及修复;下方供读者使用的 Prompt 为过程整理版,尚未由独立读者逐字执行。

1. 场景价值与交付产物预览

适合已经能打开 Codex 工作目录、能运行 Node.js 命令的读者。重点是检查 AI 修复是否真的有效。

输入是一段虚构的购物车代码:金额以整数分计价,优惠不能让应付金额小于零。输出是修复后的 cart.mjs、未被改动的测试,以及可解释的 diff。

输入原代码修复后
商品 1000 分,优惠 1500-5000
空购物车,优惠 100-1000
商品 2000 分,优惠 30017001700

这是教学练习,不是可直接接入支付系统的金额库。输入限定为合法非负整数,不覆盖校验、退款、税费与运费。

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. 示例源码与产物资源

验证状态以文章证据为准 · 非 OpenAI 官方网站