// class MockManager { // private nextInstanceId = 0; // private map: Record = {}; // /** 创建一个 mock 实例 */ // create() { // const id = this.nextInstanceId + 1; // this.nextInstanceId += 1; // this.map[id] = 0; // return id; // } // /** 递增 mock 实例值 */ // inc(id: number): number { // this.map[id] += 1; // return this.map[id]; // } // /** 重置 mock 实例值 */ // resetOne(id: number) { // this.map[id] = 0; // } // /** 重置所有 mock 实例 */ // reset() { // Object.keys(this.map).forEach((id) => { // this.resetOne(Number(id)); // }); // } // } // export const mockManager = new MockManager(); export const sleep = async (timeout = 0) => { await new Promise((resolve) => { setTimeout(resolve, timeout); }); }; export const mockInjectJsapi = () => { const MOCK_JSAPI = { invoke: () => {}, }; (window as any).WeixinJSBridge = MOCK_JSAPI; document.dispatchEvent(new Event('WeixinJSBridgeReady')); return MOCK_JSAPI; }; /** 清理 mockInjectJsapi 注入的东西,不直接作为 mockInjectJsapi 的返回,这样方便放到 jest 钩子里 */ export const resetMockJsapi = () => { delete (window as any).WeixinJSBridge; }; export const UUID_REGEX_STRING = '[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}'; export const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; export const UA_REGEX = /^Mozilla\/5\.0 \((?:darwin|win32)\) AppleWebKit\/537\.36 \(KHTML, like Gecko\) jsdom\/16\.7\.0$/; /** 封装 storage,序列化 + 缺省值 */ class Storage { /** localStorage.setItem */ setLocal(key: string, value: any) { if (!localStorage) return; if (value === undefined || value === null) { return; } localStorage.setItem(key, JSON.stringify(value)); } /** localStorage.getItem */ getLocal(key: string, defaultValue?: any) { if (!localStorage) return defaultValue; const value = localStorage.getItem(key); if (value === undefined || value === null) { return defaultValue; } try { const v = JSON.parse(value); return v; } catch (e) { // 可能是老数据未 stringify 的,兼容一下 return value; } } /** localStorage.removeItem */ removeLocal(key: string) { localStorage?.removeItem(key); } } export const storage = new Storage(); /** 执行内层所有 Promise https://stackoverflow.com/a/58716087 */ export function flushPromises() { return new Promise(jest.requireActual('timers').setImmediate); }