setup.ts
1.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import '@testing-library/jest-dom';
import { afterEach } from 'vitest';
import { cleanup } from '@testing-library/react';
// 部分 jsdom / node 运行环境未提供 localStorage,提供内存实现(token 持久化测试依赖)。
if (typeof globalThis.localStorage === 'undefined') {
const store = new Map<string, string>();
const memoryStorage: Storage = {
get length() {
return store.size;
},
clear: () => store.clear(),
getItem: (key: string) => (store.has(key) ? store.get(key)! : null),
key: (index: number) => Array.from(store.keys())[index] ?? null,
removeItem: (key: string) => {
store.delete(key);
},
setItem: (key: string, value: string) => {
store.set(key, String(value));
},
};
Object.defineProperty(globalThis, 'localStorage', {
value: memoryStorage,
configurable: true,
writable: true,
});
}
// jsdom 未实现 matchMedia,AntD 响应式逻辑会用到,提供桩实现。
if (!window.matchMedia) {
window.matchMedia = (query: string) =>
({
matches: false,
media: query,
onchange: null,
addListener: () => {},
removeListener: () => {},
addEventListener: () => {},
removeEventListener: () => {},
dispatchEvent: () => false,
}) as unknown as MediaQueryList;
}
afterEach(() => {
cleanup();
localStorage.clear();
});