全部文章
工具笔记

让 AI 测文件生成器:每次运行都有独立目录

在临时空间验证输出和失败清理。

资料核验2026.11.12 · Node.js · 小型服务与命令行工具

脚本第一次生成配置成功,第二次测试却因为上次的文件已经存在而失败。两条测试并行时,这种问题更常见。输入和输出目录跟着测试走,就能摆脱运行顺序。

给 AI 的上下文与边界

请助手用 Node 的临时目录 API 为每条用例创建独立输入与输出。给一个 UTF-8 配置样本和一个缺输入的样本,让它核对输出的实际内容、文件路径和清理路径。

流程示意:创建临时目录;验证生成文件;失败后清理

用目录验证实际副作用

用 mkdtemp 创建唯一目录,在其中写一份最小输入。生成后读取输出内容,核对路径和字符编码。再模拟缺输入或非法内容,确认不会留下看似成功的半成品。

在 finally 或测试清理回调里移除这个临时目录。删除前使用创建时拿到的完整路径,避免根据文件名拼一个可能指向其他目录的路径。

第二次跑同一测试,结果应跟第一次一致。它也应该能和同类测试同时执行。

可以直接照着做的演练

让两条用例都生成 config.json,用 mkdtemp 获得不同目录。分别写入不同端口值并读回文件。给其中一条传入破损 JSON,检查没有留下正常输出,同时另一条的结果仍存在,直到自己的清理阶段。

检查生成结果

  • 连续执行两轮都成功。
  • 并行的两条用例不共用路径。
  • 生成失败后临时目录仍能清理,业务目录未被改写。

复查时追问一层

测试如果只断言「写函数被调用」,换成读文件验证产物。对已经存在的输出文件,明确应覆盖、报错还是保持原样。清理路径应来自 mkdtemp 返回值,可避免误拼路径。

输出可能经过写临时文件再重命名。中途失败用目录内容核对是否只有你允许留下的诊断文件,不能用「没有生成目标文件」判断整个路径安全。重命名语义可能受文件系统与系统影响,跨平台承诺应另验。

示例中的 generateConfig 和 assert 由项目实现和测试入口提供。清理只使用本轮创建的目录。

import { mkdtemp, readFile, rm } from 'node:fs/promises';
import { tmpdir } from 'node:os';
import { join } from 'node:path';

const dir = await mkdtemp(join(tmpdir(), 'config-test-'));
try {
  const target = join(dir, 'config.json');
  await generateConfig(target);
  const config = JSON.parse(await readFile(target, 'utf8'));
  assert.equal(config.port, 4321);
} finally {
  await rm(dir, { recursive: true, force: true });
}

资料来源