|
@@ -1,55 +1,69 @@
|
|
|
import React from 'react';
|
|
import React from 'react';
|
|
|
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
|
|
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
|
|
|
-import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
|
|
|
|
|
+import { QueryClient, QueryClientProvider, useQuery } from '@tanstack/react-query';
|
|
|
import { vi } from 'vitest';
|
|
import { vi } from 'vitest';
|
|
|
import { toast } from 'sonner';
|
|
import { toast } from 'sonner';
|
|
|
import { BatchSpecCreator } from '../../src/components/BatchSpecCreator';
|
|
import { BatchSpecCreator } from '../../src/components/BatchSpecCreator';
|
|
|
|
|
|
|
|
-// 辅助函数:等待父商品数据加载完成
|
|
|
|
|
-const waitForParentGoodsLoaded = async () => {
|
|
|
|
|
- // 等待加载状态消失
|
|
|
|
|
- await waitFor(() => {
|
|
|
|
|
- expect(screen.queryByText('正在加载父商品信息...')).not.toBeInTheDocument();
|
|
|
|
|
- });
|
|
|
|
|
- // 等待父商品信息显示
|
|
|
|
|
- await waitFor(() => {
|
|
|
|
|
- expect(screen.getByDisplayValue('1')).toBeInTheDocument(); // 父商品ID
|
|
|
|
|
- });
|
|
|
|
|
|
|
+// Mock useQuery to return data immediately
|
|
|
|
|
+vi.mock('@tanstack/react-query', async (importOriginal) => {
|
|
|
|
|
+ const actual = await importOriginal() as any;
|
|
|
|
|
+ return {
|
|
|
|
|
+ ...actual,
|
|
|
|
|
+ useQuery: vi.fn(({ queryKey, queryFn, onSuccess }: any) => {
|
|
|
|
|
+ // 如果是获取父商品的查询
|
|
|
|
|
+ if (queryKey[0] === 'parentGoods' && queryKey[1] === 1) {
|
|
|
|
|
+ // 立即返回数据,模拟成功加载
|
|
|
|
|
+ const data = {
|
|
|
|
|
+ id: 1,
|
|
|
|
|
+ name: '测试父商品',
|
|
|
|
|
+ categoryId1: 1,
|
|
|
|
|
+ categoryId2: 2,
|
|
|
|
|
+ categoryId3: 3,
|
|
|
|
|
+ goodsType: 1,
|
|
|
|
|
+ supplierId: 1,
|
|
|
|
|
+ merchantId: 1,
|
|
|
|
|
+ price: 100,
|
|
|
|
|
+ costPrice: 80,
|
|
|
|
|
+ stock: 100,
|
|
|
|
|
+ state: 1
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ // 调用onSuccess回调(如果提供)
|
|
|
|
|
+ if (onSuccess) {
|
|
|
|
|
+ setTimeout(() => onSuccess(data), 0);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return {
|
|
|
|
|
+ data,
|
|
|
|
|
+ isLoading: false,
|
|
|
|
|
+ isError: false,
|
|
|
|
|
+ error: null,
|
|
|
|
|
+ refetch: vi.fn()
|
|
|
|
|
+ };
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 其他查询使用原始实现
|
|
|
|
|
+ return actual.useQuery({ queryKey, queryFn });
|
|
|
|
|
+ })
|
|
|
|
|
+ };
|
|
|
|
|
+});
|
|
|
|
|
+
|
|
|
|
|
+// Mock the goodsClientManager for mutation tests
|
|
|
|
|
+const mockGoodsClient = {
|
|
|
|
|
+ index: {
|
|
|
|
|
+ $post: vi.fn(() => {
|
|
|
|
|
+ return Promise.resolve({
|
|
|
|
|
+ status: 201,
|
|
|
|
|
+ json: () => Promise.resolve({ id: 100, name: '父商品 - 规格1' })
|
|
|
|
|
+ });
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-// Mock the goodsClientManager
|
|
|
|
|
vi.mock('../../src/api/goodsClient', () => ({
|
|
vi.mock('../../src/api/goodsClient', () => ({
|
|
|
goodsClientManager: {
|
|
goodsClientManager: {
|
|
|
- get: vi.fn(() => ({
|
|
|
|
|
- ':id': {
|
|
|
|
|
- $get: vi.fn(({ param }: { param: { id: number } }) => {
|
|
|
|
|
- // 模拟获取父商品详情API
|
|
|
|
|
- return Promise.resolve({
|
|
|
|
|
- status: 200,
|
|
|
|
|
- json: () => Promise.resolve({
|
|
|
|
|
- id: param.id,
|
|
|
|
|
- name: '测试父商品',
|
|
|
|
|
- categoryId1: 1,
|
|
|
|
|
- categoryId2: 2,
|
|
|
|
|
- categoryId3: 3,
|
|
|
|
|
- goodsType: 1,
|
|
|
|
|
- supplierId: 1,
|
|
|
|
|
- merchantId: 1,
|
|
|
|
|
- price: 100,
|
|
|
|
|
- costPrice: 80,
|
|
|
|
|
- stock: 100,
|
|
|
|
|
- state: 1
|
|
|
|
|
- })
|
|
|
|
|
- });
|
|
|
|
|
- })
|
|
|
|
|
- },
|
|
|
|
|
- index: {
|
|
|
|
|
- $post: vi.fn(() => Promise.resolve({
|
|
|
|
|
- status: 201,
|
|
|
|
|
- json: () => Promise.resolve({ id: 100, name: '父商品 - 规格1' })
|
|
|
|
|
- }))
|
|
|
|
|
- }
|
|
|
|
|
- }))
|
|
|
|
|
|
|
+ get: vi.fn(() => mockGoodsClient)
|
|
|
}
|
|
}
|
|
|
}));
|
|
}));
|
|
|
|
|
|
|
@@ -66,10 +80,11 @@ const queryClient = new QueryClient({
|
|
|
queries: {
|
|
queries: {
|
|
|
retry: false,
|
|
retry: false,
|
|
|
staleTime: 0,
|
|
staleTime: 0,
|
|
|
- cacheTime: 0,
|
|
|
|
|
|
|
+ gcTime: 0, // 注意:React Query v5中cacheTime改为gcTime
|
|
|
refetchOnWindowFocus: false,
|
|
refetchOnWindowFocus: false,
|
|
|
refetchOnMount: true,
|
|
refetchOnMount: true,
|
|
|
refetchOnReconnect: false,
|
|
refetchOnReconnect: false,
|
|
|
|
|
+ enabled: true, // 确保查询启用
|
|
|
},
|
|
},
|
|
|
mutations: {
|
|
mutations: {
|
|
|
retry: false,
|
|
retry: false,
|
|
@@ -96,24 +111,27 @@ describe('BatchSpecCreator', () => {
|
|
|
vi.clearAllMocks();
|
|
vi.clearAllMocks();
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
- it('应该正确渲染组件', async () => {
|
|
|
|
|
|
|
+ it('应该正确渲染组件', () => {
|
|
|
render(
|
|
render(
|
|
|
<Wrapper>
|
|
<Wrapper>
|
|
|
<BatchSpecCreator {...defaultProps} />
|
|
<BatchSpecCreator {...defaultProps} />
|
|
|
</Wrapper>
|
|
</Wrapper>
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
|
|
+ // 检查对话框标题
|
|
|
expect(screen.getByText('批量创建子商品规格')).toBeInTheDocument();
|
|
expect(screen.getByText('批量创建子商品规格')).toBeInTheDocument();
|
|
|
expect(screen.getByText('为父商品 "父商品" 批量创建多个子商品规格')).toBeInTheDocument();
|
|
expect(screen.getByText('为父商品 "父商品" 批量创建多个子商品规格')).toBeInTheDocument();
|
|
|
|
|
+
|
|
|
|
|
+ // 检查父商品信息区域
|
|
|
expect(screen.getByText('父商品信息')).toBeInTheDocument();
|
|
expect(screen.getByText('父商品信息')).toBeInTheDocument();
|
|
|
expect(screen.getByText('规格列表')).toBeInTheDocument();
|
|
expect(screen.getByText('规格列表')).toBeInTheDocument();
|
|
|
|
|
|
|
|
- // 等待父商品数据加载完成
|
|
|
|
|
- await waitFor(() => {
|
|
|
|
|
- expect(screen.getByDisplayValue('1')).toBeInTheDocument(); // 父商品ID
|
|
|
|
|
- });
|
|
|
|
|
-
|
|
|
|
|
|
|
+ // 检查父商品ID和名称(从props传入)
|
|
|
|
|
+ expect(screen.getByDisplayValue('1')).toBeInTheDocument(); // 父商品ID
|
|
|
expect(screen.getByDisplayValue('父商品')).toBeInTheDocument(); // 父商品名称
|
|
expect(screen.getByDisplayValue('父商品')).toBeInTheDocument(); // 父商品名称
|
|
|
|
|
+
|
|
|
|
|
+ // 检查分类ID - 现在应该显示正确的值(从mock的useQuery返回)
|
|
|
|
|
+ // 注意:由于useQuery被mock,数据会立即返回,所以分类ID应该显示1,2,3而不是0
|
|
|
expect(screen.getByDisplayValue('1')).toBeInTheDocument(); // 一级分类ID
|
|
expect(screen.getByDisplayValue('1')).toBeInTheDocument(); // 一级分类ID
|
|
|
expect(screen.getByDisplayValue('2')).toBeInTheDocument(); // 二级分类ID
|
|
expect(screen.getByDisplayValue('2')).toBeInTheDocument(); // 二级分类ID
|
|
|
expect(screen.getByDisplayValue('3')).toBeInTheDocument(); // 三级分类ID
|
|
expect(screen.getByDisplayValue('3')).toBeInTheDocument(); // 三级分类ID
|