Skip to content

配置、环境与第一条测试:练习答案 ​

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。

用心记录每一步成长