小毅
发布于 2026-01-25 / 0 阅读
0
0

Typescript 代码测试

obsidain 的插件 calendar 有个 bug,ISO 周的小白点是不显示的,看了下原作者发现上一次更新是 2022 年,看来作者已经很久不维护了,因此打算自己改一改

在改的过程中,测试代码感觉比较麻烦,每次都得手动更改代码。但观察插件项目发现,它是有测试项目的,路径为

src/__tests__

可以通过执行指令来运行测试

npm test

但有时候出错的时候,报的错误数比较多,如果要看完的话,得把终端拉的比较大,但我不太想这么做,于是将输出重定向到 test.log 里

npm test 2>&1 | Tee-Object -FilePath test.log

重定向倒是实现了,但是在 Windows 上你执行 npm 时,真正跑的是一个 PowerShell 脚本 npm.ps1(它再调用 node.exe npm-cli.js ...)。当管道存在时,PowerShell 更倾向把来自外部程序的 stderr 包装成 NativeCommandError,所以报错位置显示在 npm.ps1 里,于是得到结果

> obsidian-daily-notes-interface@1.0.1 test
> jest

node.exe : PASS src/__tests__/yearly.spec.ts
所在位置 ...\NodeJs\npm.ps1:29 字符: 3
+   & $NODE_EXE $NPM_CLI_JS $args
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (PASS src/__tests__/yearly.spec.ts:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
 
PASS src/__tests__/weekly.spec.ts
PASS src/__tests__/monthly.spec.ts
PASS src/__tests__/quarterly.spec.ts
PASS src/__tests__/parse.spec.ts
PASS src/__tests__/daily.spec.ts
PASS src/__tests__/vault.spec.ts

Test Suites: 7 passed, 7 total
Tests:       95 passed, 95 total
Snapshots:   0 total
Time:        1.283 s
Ran all test suites.

为了避免该问题出现,可以使用 cmd 绕开 powershell 的管道行为

cmd /c "npm test > test.log 2>&1"

不过尽可能不要在 powershell 里运行指令,因为 powershell 有坑,当你想单独测试某个 case 时,如果用 powershell,你会发现无法传递 -t 参数下去,例如

npm test -- parse.spec.ts --t 'xxx'

powershell 执行结果为:

npm warn "xxx" is being parsed as a normal command line argument.
npm warn Unknown cli config "--t". This will stop working in the next major version of npm.

> obsidian-daily-notes-interface@1.0.1 test
> jest parse.spec.ts xxx

提示无法识别指令 --t,那是因为在 PowerShell 中,-- 是一个保留的操作符(Stop Parsing Symbol)。当你输入 npm test -- ... 时,PowerShell 自己把 -- 吃掉了,它并没有把这个双横线传给 npm


评论