jest如何模拟网络请求中的错误情况

背景

在网络请求中,我们习惯了模拟返回正确的数据,而忽略他的catch情况。因为一般情况下并不会太大的影响覆盖率,但是当测试页面本身代码量少或者catch中有太多的未执行代码,那么也会因此大大降低覆盖率。此时我们便需要模拟网络请求的错误情况。

两种网络请求方法

  • react-query
  • axios

react-query如何通过jest模拟错误情况

我们会有一个react-query相关的方法

export const useSubmitData = (): UseMutationResult<
  any[], //返回值类型
  AxiosError<any>, // 返回错误值类型 其中any可以具体到错误类型的每一个值
  any // 参数传入值类型
> => {
return useMutation<any[],AxiosError<any>,any>(
  submitData2
)}

然后我们只需要对其返回的mutate多加一个onError即可

jest.mock('src/query/home/home');
import {useSubmitData} from 'src/query/home/home';
const mockSubmit = useSubmitData as jest.MockedFunction<typeof useSubmitData>;
mockSubmit.mockImplementation(
  () => {
    return {
      mutate: jest.fn((_,{onSuccess,onError}) => {
        onSuccess({
          code: 200
        })
        onError({
          code: '501'
        })
      })
    } as unknown as any
  }
)

这种好处是,不需要写两种情况,直接写在一起,react-query会自动分配

axios如何通过jest模拟错误情况

同样,我们会有一个相关的方法

export const getUserData = async () => {
  const path = commonUrl + '/home/user';
  const res = await axios.get(path);
  return res.data;
}

然后我们在mock的时候得写两份,因此我们会有两个test/it,写法大概如下面

import * as api from "src/api/detail";

test('calls updateUsername with the new username', async () => {
  const mockGetData2 = jest.spyOn(api,'getUserData')
  mockGetData2.mockImplementation(
    () => {
      return Promise.resolve({
        id: '999', 
        name: 'mike'
      })
    }
  )
  
  ...其他测试内容
  await act(async () => {
    expect(mockGetData2).toBeCalled();
  })
})

test('catch in axios', async () => {
  const mockGetData = jest.spyOn(api,'getUserData')
  mockGetData.mockImplementation(
    () => {
      return Promise.reject({
        id: '999', 
        name: 'mike'
      })
    }
  )
  ...其他测试内容
  await act(async () => {
    expect(mockGetData).toBeCalled();
  })
})

以上便是axios和react-query使用jest测试覆盖catch的情况

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容