This commit is contained in:
2026-09-12 14:19:56 +08:00
commit 87ab0b794b
130 changed files with 30042 additions and 0 deletions

40
vitest.setup.ts Normal file
View File

@@ -0,0 +1,40 @@
import '@testing-library/jest-dom'
// RTL v13+ 默认会注册 afterEach 清理,但在 vitest + jsdom 下偶尔 cleanup 没跑,
// 导致用例之间的 DOM 残留(出现多个「粘贴代码 → 运行 → 看热点与可优化点」之类)。
// 显式 register 一次保险。
import { afterEach, vi } from 'vitest'
import { cleanup } from '@testing-library/react'
// jsdom 不带 ResizeObserver,App 用 useEffect 注册它来跟踪主区尺寸变化。
// 给一个最小的 noop stub —— 我们的测试只关心渲染产物,不真关心尺寸。
if (typeof globalThis.ResizeObserver === 'undefined') {
globalThis.ResizeObserver = class {
observe(): void {}
unobserve(): void {}
disconnect(): void {}
} as unknown as typeof ResizeObserver
}
// jsdom 24 仍未实现 PointerEvent; fireEvent.pointerDown 因此退化成裸 Event,button
// / clientX / pointerId 全丢失 —— Splitter 这类用 Pointer Events 的组件测不出来。
// 给一个最小 polyfill:继承 MouseEvent(jsdom 已支持)补 pointerId / pointerType,
// 让 RTL 派发的 PointerEventInit(button / clientX / pointerId / pointerType)真正生效。
if (typeof globalThis.PointerEvent === 'undefined') {
class PointerEventPolyfill extends MouseEvent {
public readonly pointerId: number
public readonly pointerType: string
public readonly isPrimary: boolean
constructor(type: string, params: PointerEventInit = {}) {
super(type, params)
this.pointerId = params.pointerId ?? 0
this.pointerType = params.pointerType ?? ''
this.isPrimary = params.isPrimary ?? true
}
}
globalThis.PointerEvent = PointerEventPolyfill as unknown as typeof PointerEvent
}
afterEach(() => {
cleanup()
vi.restoreAllMocks()
})