配置、环境与第一条测试:练习答案
1. 金额边界
金额使用分而不是浮点元:
ts
export function totalInCents(priceInCents: number, taxRate: number) {
if (!Number.isInteger(priceInCents) || priceInCents < 0) throw new RangeError('price')
if (!Number.isFinite(taxRate) || taxRate < 0 || taxRate > 1) throw new RangeError('tax')
return Math.round(priceInCents * (1 + taxRate))
}1999 * 1.2 得到 2398.8,业务需要明确舍入规则;Math.round 是本实验的规则,不代表所有税务系统都应采用它。若改用浮点元,19.99 * 1.2 的二进制表示会把误差带进断言。
2. DOM 失败层级
删除环境注释后,测试在 Node 环境通常在断言前抛出 document is not defined;这是测试文件没有声明宿主。保留注释但移除 jsdom 依赖时,Vitest 会报告找不到环境包;这是安装/解析层错误。两者都不应通过给全局对象手写一个假 document 来掩盖。
3. alias 修复
可用 Vite 配置显式映射:
ts
import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vitest/config'
export default defineConfig({
resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) } },
test: { environment: 'node' },
})之后 import { totalInCents } from '@/money' 与构建、测试使用同一解析规则。只在 tsconfig.json 加 paths 而不改 Vite,类型检查可能通过但运行仍失败。
答案的可验证信号是:npm test 对金额用例通过;DOM 文件在 jsdom 中通过;去掉声明或依赖时能复现对应层级的错误。真实浏览器能力仍需 Browser Mode。