import { render, RenderResult } from '@testing-library/react' import React from 'react' export const delay = (ms = 500) => { return new Promise((resolve) => { setTimeout(() => { resolve() }, ms) }) } export function toCamelCase(s: string) { let camel = '' let nextCap = false for (let i = 0; i < s.length; i++) { if (s[i] !== '-') { camel += nextCap ? s[i].toUpperCase() : s[i] nextCap = false } else { nextCap = true } } return camel } export function capitalize(s: string) { return s.charAt(0).toUpperCase() + s.slice(1) } export function printUnimplementedWarning(node?: Node) { const name = node?.nodeName.slice(5).replace('-CORE', '').toLowerCase() || 'unknown' return `H5 暂不支持 ${capitalize(toCamelCase(name))} 组件!` } export function parsePx2Number(px: string) { return Number(px.replace('px', '')) } export function parseStyle2String(...styles: Record[]) { const style = Object.assign({}, ...styles) return Object.entries(style).map(([key, value]) => `${key}: ${value};`).join('') } // React 测试工具函数 export function renderWithProviders( ui: React.ReactElement, options?: any ): RenderResult { return render(ui, { ...options, }) } // 模拟事件工具 export const createMockEvent = (type: string, detail?: any) => ({ type, detail: detail || {}, preventDefault: jest.fn(), stopPropagation: jest.fn(), }) // 模拟 Taro 环境 export const mockTaroEnv = () => { // 模拟 Taro 的 View 组件 jest.doMock('@tarojs/components', () => ({ View: ({ children, ...props }: any) => React.createElement('div', props, children), Text: ({ children, ...props }: any) => React.createElement('span', props, children), Image: (props: any) => React.createElement('img', props), Button: ({ children, ...props }: any) => React.createElement('button', props, children), })) } // 测试数据生成器 export const createTestData = { // 创建选择器数据 selector: (count = 5) => Array.from({ length: count }, (_, i) => `选项${i + 1}`), // 创建多选择器数据 multiSelector: () => [ ['早餐', '午餐', '晚餐'], ['米饭', '面条', '馒头'], ['青菜', '肉类', '海鲜'] ], // 创建时间数据 time: () => ({ start: '00:00', end: '23:59', value: '12:00' }), // 创建日期数据 date: () => ({ start: '2020-01-01', end: '2030-12-31', value: '2024-01-01' }), // 创建地区数据 region: () => [ { value: '北京市', code: '110000', children: [ { value: '北京市', code: '110100', children: [ { value: '东城区', code: '110101' }, { value: '西城区', code: '110102' } ] } ] } ] } // 模拟 Taro API export const mockTaroApis = { navigateTo: jest.fn(), redirectTo: jest.fn(), switchTab: jest.fn(), navigateBack: jest.fn(), reLaunch: jest.fn(), showToast: jest.fn(), showModal: jest.fn(), showLoading: jest.fn(), hideLoading: jest.fn(), request: jest.fn(), uploadFile: jest.fn(), downloadFile: jest.fn(), getStorage: jest.fn(), setStorage: jest.fn(), removeStorage: jest.fn(), clearStorage: jest.fn(), getSystemInfo: jest.fn(), getNetworkType: jest.fn(), onNetworkStatusChange: jest.fn(), offNetworkStatusChange: jest.fn(), } // 组件测试辅助函数 export const createTestComponent = (Component: React.ComponentType, props: any = {}) => { return React.createElement(Component, props) }