返回
如何优雅地模拟多个封装式 GraphQL 请求?
javascript
2024-03-21 10:42:42
模拟多个封装式 GraphQL 请求的 Jest 测试解决方案
问题概述
在测试使用 axios
库封装的 GraphQL API 请求的 Redux sagas 时,面临着模拟多个请求的挑战。由于模拟被顺序执行,导致后续请求实际发送到后端,破坏了测试结果。
解决方案
问题的关键在于没有在每个测试用例后清除模拟。通过在 afterEach
函数中添加 jest.clearAllMocks()
,可以确保在每个测试开始时清除模拟,从而防止意想不到的行为。
代码示例
以下是如何在测试中添加 afterEach
函数:
import { afterEach } from '@jest/globals';
import { sampleSaga } from './sampleSaga';
import { sampleOneApiRequest, sampleTwoApiRequest } from 'path/api';
import { successAction } from 'path/redux/action';
import { put } from 'redux-saga/effects';
jest.mock('path/api', () => ({
sampleOneApiRequest: async () => { id: 'sample1' },
sampleTwoApiRequest: async () => { id: 'sample2' }
}));
descripe('test sampleSaga', () => {
if('test sampleSaga switch false', () => {
const generator = sampleSaga({ payload: { switch: false } });
const apiResponse = { data: { id: 'sample1' } };
expect(generator.next().value).toEqual(sampleOneApiRequest());
expect(generator.next(apiResponse).value).toEqual(put(successAction(apiResponse)))
});
if('test sampleSaga switch true', () => {
const generator = sampleSaga({ payload: { switch: true } });
const apiResponse = { data: { id: 'sample2' } };
expect(generator.next().value).toEqual(sampleTwoApiRequest());
expect(generator.next(apiResponse).value).toEqual(put(successAction(apiResponse)))
});
afterEach(() => {
jest.clearAllMocks();
});
});
常见问题解答
1. 为什么清除模拟很重要?
清除模拟可确保每个测试用例从干净的模拟状态开始,防止残留的模拟影响后续测试。
2. 如何使用 Jest 来模拟?
Jest 提供了多种模拟方法,包括 jest.fn()
、jest.spyOn()
和 jest.mock()
,具体取决于模拟的类型和要求。
3. 什么时候应该使用 afterEach
函数?
afterEach
函数在每个测试用例后运行,用于清理测试环境、重置模拟并释放资源。
4. 如何使用 jest.clearAllMocks()
?
jest.clearAllMocks()
方法用于清除所有模拟的调用、参数和返回值。
5. 什么是好的测试用例的特征?
好的测试用例应清晰、简洁、可重复、可靠,并且提供对目标功能的有效覆盖。