|
|
@@ -1,5 +1,5 @@
|
|
|
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
|
-import { render, screen, fireEvent, waitFor } from '@testing-library/react';
|
|
|
+import { render, screen, fireEvent, waitFor, within } from '@testing-library/react';
|
|
|
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
|
import SalaryManagement from '../../src/components/SalaryManagement';
|
|
|
import { salaryClientManager } from '../../src/api/salaryClient';
|
|
|
@@ -224,20 +224,24 @@ describe('薪资管理集成测试', () => {
|
|
|
renderComponent();
|
|
|
|
|
|
await waitFor(() => {
|
|
|
- // 检查第一条数据
|
|
|
- expect(screen.getByText('1')).toBeInTheDocument();
|
|
|
- expect(screen.getByText('北京市')).toBeInTheDocument();
|
|
|
- expect(screen.getByText('北京市辖区')).toBeInTheDocument();
|
|
|
- expect(screen.getByText('¥5000.00')).toBeInTheDocument();
|
|
|
- expect(screen.getByText('¥4700.00')).toBeInTheDocument();
|
|
|
+ // 检查第一条数据 - 使用test ID避免分页冲突
|
|
|
+ const row1 = screen.getByTestId('salary-row-1');
|
|
|
+ expect(row1).toBeInTheDocument();
|
|
|
+ expect(within(row1).getByText('1')).toBeInTheDocument();
|
|
|
+ expect(within(row1).getByText('北京市')).toBeInTheDocument();
|
|
|
+ expect(within(row1).getByText('北京市辖区')).toBeInTheDocument();
|
|
|
+ expect(within(row1).getByText('¥5000.00')).toBeInTheDocument();
|
|
|
+ expect(within(row1).getByText('¥4700.00')).toBeInTheDocument();
|
|
|
|
|
|
// 检查第二条数据
|
|
|
- expect(screen.getByText('2')).toBeInTheDocument();
|
|
|
- expect(screen.getByText('上海市')).toBeInTheDocument();
|
|
|
- expect(screen.getByText('上海市辖区')).toBeInTheDocument();
|
|
|
- expect(screen.getByText('黄浦区')).toBeInTheDocument();
|
|
|
- expect(screen.getByText('¥6000.00')).toBeInTheDocument();
|
|
|
- expect(screen.getByText('¥5700.00')).toBeInTheDocument();
|
|
|
+ const row2 = screen.getByTestId('salary-row-2');
|
|
|
+ expect(row2).toBeInTheDocument();
|
|
|
+ expect(within(row2).getByText('2')).toBeInTheDocument();
|
|
|
+ expect(within(row2).getByText('上海市')).toBeInTheDocument();
|
|
|
+ expect(within(row2).getByText('上海市辖区')).toBeInTheDocument();
|
|
|
+ expect(within(row2).getByText('黄浦区')).toBeInTheDocument();
|
|
|
+ expect(within(row2).getByText('¥6000.00')).toBeInTheDocument();
|
|
|
+ expect(within(row2).getByText('¥5700.00')).toBeInTheDocument();
|
|
|
});
|
|
|
});
|
|
|
|
|
|
@@ -273,13 +277,14 @@ describe('薪资管理集成测试', () => {
|
|
|
it('应该打开添加薪资模态框', async () => {
|
|
|
renderComponent();
|
|
|
|
|
|
- // 点击添加按钮
|
|
|
- const addButton = screen.getByText('添加薪资');
|
|
|
+ // 点击添加按钮 - 使用test ID避免多个"添加薪资"文本
|
|
|
+ const addButton = screen.getByTestId('add-salary-button');
|
|
|
fireEvent.click(addButton);
|
|
|
|
|
|
- // 检查模态框标题
|
|
|
+ // 检查模态框标题 - 使用getAllByText获取第二个"添加薪资"(模态框标题)
|
|
|
await waitFor(() => {
|
|
|
- expect(screen.getByText('添加薪资')).toBeInTheDocument();
|
|
|
+ const addSalaryTexts = screen.getAllByText('添加薪资');
|
|
|
+ expect(addSalaryTexts.length).toBeGreaterThanOrEqual(2); // 按钮 + 模态框标题
|
|
|
expect(screen.getByText('填写薪资信息,支持实时计算总薪资')).toBeInTheDocument();
|
|
|
});
|
|
|
|
|
|
@@ -295,11 +300,12 @@ describe('薪资管理集成测试', () => {
|
|
|
renderComponent();
|
|
|
|
|
|
// 打开添加模态框
|
|
|
- const addButton = screen.getByText('添加薪资');
|
|
|
+ const addButton = screen.getByTestId('add-salary-button');
|
|
|
fireEvent.click(addButton);
|
|
|
|
|
|
await waitFor(() => {
|
|
|
- expect(screen.getByText('添加薪资')).toBeInTheDocument();
|
|
|
+ const addSalaryTexts = screen.getAllByText('添加薪资');
|
|
|
+ expect(addSalaryTexts.length).toBeGreaterThanOrEqual(2);
|
|
|
});
|
|
|
|
|
|
// 填写表单数据
|
|
|
@@ -313,9 +319,10 @@ describe('薪资管理集成测试', () => {
|
|
|
fireEvent.change(insuranceInput, { target: { value: '500' } });
|
|
|
fireEvent.change(housingFundInput, { target: { value: '800' } });
|
|
|
|
|
|
- // 检查总薪资计算
|
|
|
+ // 检查总薪资计算 - 使用getAllByText因为有两个¥4700.00
|
|
|
await waitFor(() => {
|
|
|
- expect(screen.getByText('¥4700.00')).toBeInTheDocument();
|
|
|
+ const totalSalaryElements = screen.getAllByText('¥4700.00');
|
|
|
+ expect(totalSalaryElements.length).toBeGreaterThanOrEqual(1);
|
|
|
expect(screen.getByText('计算公式:基本工资 + 津贴 - 保险 - 公积金')).toBeInTheDocument();
|
|
|
});
|
|
|
});
|
|
|
@@ -324,12 +331,13 @@ describe('薪资管理集成测试', () => {
|
|
|
renderComponent();
|
|
|
|
|
|
await waitFor(() => {
|
|
|
- expect(screen.getByText('北京市')).toBeInTheDocument();
|
|
|
+ const row1 = screen.getByTestId('salary-row-1');
|
|
|
+ expect(within(row1).getByText('北京市')).toBeInTheDocument();
|
|
|
});
|
|
|
|
|
|
- // 点击编辑按钮(第一个薪资记录的编辑按钮)
|
|
|
- const editButtons = screen.getAllByRole('button', { name: /编辑/i });
|
|
|
- fireEvent.click(editButtons[0]);
|
|
|
+ // 点击编辑按钮 - 使用test ID
|
|
|
+ const editButton = screen.getByTestId('edit-salary-1');
|
|
|
+ fireEvent.click(editButton);
|
|
|
|
|
|
// 检查编辑模态框
|
|
|
await waitFor(() => {
|
|
|
@@ -342,16 +350,18 @@ describe('薪资管理集成测试', () => {
|
|
|
renderComponent();
|
|
|
|
|
|
await waitFor(() => {
|
|
|
- expect(screen.getByText('北京市')).toBeInTheDocument();
|
|
|
+ const row1 = screen.getByTestId('salary-row-1');
|
|
|
+ expect(within(row1).getByText('北京市')).toBeInTheDocument();
|
|
|
});
|
|
|
|
|
|
- // 点击删除按钮(第一个薪资记录的删除按钮)
|
|
|
- const deleteButtons = screen.getAllByRole('button', { name: /删除/i });
|
|
|
- fireEvent.click(deleteButtons[0]);
|
|
|
+ // 点击删除按钮 - 使用test ID
|
|
|
+ const deleteButton = screen.getByTestId('delete-salary-1');
|
|
|
+ fireEvent.click(deleteButton);
|
|
|
|
|
|
- // 检查删除确认对话框
|
|
|
+ // 检查删除确认对话框 - 使用getAllByText因为有两个"确认删除"文本
|
|
|
await waitFor(() => {
|
|
|
- expect(screen.getByText('确认删除')).toBeInTheDocument();
|
|
|
+ const confirmDeleteElements = screen.getAllByText('确认删除');
|
|
|
+ expect(confirmDeleteElements.length).toBeGreaterThanOrEqual(2); // 标题 + 按钮
|
|
|
expect(screen.getByText('确定要删除这条薪资信息吗?此操作不可撤销。')).toBeInTheDocument();
|
|
|
});
|
|
|
});
|
|
|
@@ -363,10 +373,11 @@ describe('薪资管理集成测试', () => {
|
|
|
|
|
|
renderComponent();
|
|
|
|
|
|
- // 检查错误处理
|
|
|
+ // 检查错误处理 - 使用test ID检查表格行不存在
|
|
|
await waitFor(() => {
|
|
|
// 表格应该为空或显示加载状态
|
|
|
- expect(screen.queryByText('北京市')).not.toBeInTheDocument();
|
|
|
+ expect(screen.queryByTestId('salary-row-1')).not.toBeInTheDocument();
|
|
|
+ expect(screen.queryByTestId('salary-row-2')).not.toBeInTheDocument();
|
|
|
});
|
|
|
});
|
|
|
});
|