test-render.tsx 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { ReactNode } from 'react';
  2. import { BrowserRouter } from 'react-router-dom';
  3. import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
  4. import { ThemeProvider } from 'next-themes';
  5. import { AuthProvider } from '@/client/admin/hooks/AuthProvider';
  6. /**
  7. * 创建测试用的QueryClient
  8. */
  9. export function createTestQueryClient() {
  10. return new QueryClient({
  11. defaultOptions: {
  12. queries: {
  13. retry: false,
  14. gcTime: 0,
  15. },
  16. mutations: {
  17. retry: false,
  18. },
  19. }
  20. });
  21. }
  22. /**
  23. * 测试渲染器的包装组件
  24. */
  25. export function TestWrapper({ children }: { children: ReactNode }) {
  26. const queryClient = createTestQueryClient();
  27. return (
  28. <QueryClientProvider client={queryClient}>
  29. <ThemeProvider attribute="class" defaultTheme="light">
  30. <BrowserRouter>
  31. {children}
  32. </BrowserRouter>
  33. </ThemeProvider>
  34. </QueryClientProvider>
  35. );
  36. }
  37. /**
  38. * 专门用于admin页面的测试包装器,包含AuthProvider
  39. */
  40. export function AdminTestWrapper({ children }: { children: ReactNode }) {
  41. const queryClient = createTestQueryClient();
  42. // Mock localStorage for tests
  43. const localStorageMock = {
  44. getItem: vi.fn(() => null),
  45. setItem: vi.fn(),
  46. removeItem: vi.fn(),
  47. clear: vi.fn(),
  48. };
  49. // Set up localStorage mock
  50. Object.defineProperty(window, 'localStorage', {
  51. value: localStorageMock,
  52. writable: true,
  53. });
  54. return (
  55. <QueryClientProvider client={queryClient}>
  56. <ThemeProvider attribute="class" defaultTheme="light">
  57. <BrowserRouter>
  58. <AuthProvider>
  59. {children}
  60. </AuthProvider>
  61. </BrowserRouter>
  62. </ThemeProvider>
  63. </QueryClientProvider>
  64. );
  65. }
  66. /**
  67. * 等待组件更新完成
  68. */
  69. export async function waitForUpdate(delay = 0) {
  70. await new Promise(resolve => setTimeout(resolve, delay));
  71. }