Skip to content

Node.js 路径分隔符模拟:依赖注入解决方案

问题描述

Node.js 路径工具如 path.seppath.join() 被硬编码为当前平台且只读 - 无法为跨平台测试进行模拟:

javascript
// 这会失败 - path.sep 是只读的
path.sep = '\\'; // Error: Cannot redefine property

// 这会忽略你的意愿 - 始终使用当前平台
path.join('a', 'b'); // Linux 上始终是 'a/b',Windows 上始终是 'a\\b'

解决方案

不要模拟全局 path - 使用 path.win32path.posix 注入平台特定实现:

javascript
// 不要用这种脆弱的方法:
function createTempFile(name: string, separator: string) {
  return 'tmp' + separator + name; // 手动字符串操作
}

// 使用依赖注入:
function createTempFile(name: string, pathImpl = path) {
  return pathImpl.join('tmp', name);
}

// 现在可以可靠地测试两个平台:
createTempFile('data.json', path.win32)  // → tmp\data.json
createTempFile('data.json', path.posix)  // → tmp/data.json

为什么有效

Node.js 提供了 path.win32path.posix 作为独立的实现。不要与平台依赖性作斗争,通过干净的依赖注入拥抱它。在 Linux 上测试 Windows 逻辑,在 Windows 上测试 Unix 逻辑 - 无需模拟。

基于 MIT 许可证发布。