面试题答案
一键面试1. 测试环境搭建
首先确保项目中安装了 jest
、@testing-library/svelte
以及 jest-fetch-mock
(用于模拟网络请求)等必要库。
2. 模拟异步操作
- 使用
async/await
与async
测试函数:- 在测试用例函数前添加
async
,在调用异步函数后使用await
。例如,假设组件中有一个fetchData
函数用于发起异步 API 调用:
import { render, screen } from '@testing-library/svelte'; import MyComponent from './MyComponent.svelte'; describe('MyComponent', () => { it('should update state after successful API call', async () => { render(MyComponent); // 等待异步操作完成 await screen.findByText('Data from API'); }); });
- 在测试用例函数前添加
- 使用
jest.useFakeTimers()
处理异步定时器:如果组件中有依赖定时器的逻辑,如setTimeout
或setInterval
,可以使用jest.useFakeTimers()
来控制时间流逝。例如:describe('MyComponent with timer', () => { beforeEach(() => { jest.useFakeTimers(); }); it('should update state after timer expires', async () => { render(MyComponent); // 假设组件在定时器到期后更新状态 jest.advanceTimersByTime(1000); await screen.findByText('Updated after timer'); }); });
3. Mock 外部模块
- 使用
jest.mock()
:假设外部模块名为apiService
,它有一个fetchData
函数用于发起 API 调用。在测试文件顶部使用jest.mock()
来 Mock 该模块:import { render, screen } from '@testing-library/svelte'; import MyComponent from './MyComponent.svelte'; import apiService from './apiService'; jest.mock('./apiService'); describe('MyComponent', () => { it('should handle successful API call', async () => { const mockData = { message: 'Mocked data' }; apiService.fetchData.mockResolvedValue(mockData); render(MyComponent); await screen.findByText(mockData.message); }); it('should handle failed API call', async () => { const errorMessage = 'Network error'; apiService.fetchData.mockRejectedValue(new Error(errorMessage)); render(MyComponent); await screen.findByText(errorMessage); }); });
4. 处理竞争条件
- 使用
act
函数:@testing-library/svelte
中的act
函数可以帮助处理 Svelte 组件中的状态更新。确保在测试异步状态更新时使用act
。例如:import { render, screen, act } from '@testing-library/svelte'; import MyComponent from './MyComponent.svelte'; describe('MyComponent with race condition', () => { it('should handle state updates correctly', async () => { render(MyComponent); await act(async () => { // 模拟异步操作,例如触发一个按钮点击,该点击会发起异步调用 const button = screen.getByText('Fetch Data'); button.click(); }); await screen.findByText('Data loaded'); }); });
- 使用
jest.setTimeout()
:增加测试的超时时间,确保异步操作有足够的时间完成,避免因竞争条件导致测试误判。例如:describe('MyComponent with long - running async', () => { jest.setTimeout(10000); // 设置超时时间为10秒 it('should complete long - running async operation', async () => { render(MyComponent); await screen.findByText('Data from long - running API'); }); });