test-render.tsx 1.9 KB

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