返回

如何优雅地模拟多个封装式 GraphQL 请求?

javascript

模拟多个封装式 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. 什么是好的测试用例的特征?

好的测试用例应清晰、简洁、可重复、可靠,并且提供对目标功能的有效覆盖。