使用Jest模拟@ apollo / react-hooks useQuery

时间:2020-07-10 09:06:11

标签: typescript unit-testing jestjs react-hooks apollo-client

我目前正在尝试从index.ts模拟出useQuery,但是由于useMenu是一个只读值,所以我不能这样做。

index.ts

import { useQuery } from "@apollo/react-hooks";
import { MENU } from "../../graphql/queries/menu";

export const useMenu = (myNumber: number) => {
  return useQuery(MENU, {
    variables: { myNumber }
  });
};

菜单

import gql from "graphql-tag";

export const MENU = gql`
  fragment MenuItemFields on MenuItem {
    field1
    field2
    field3
    field4
  }
  query Menu($myNumber: Float!) {
    menu(myNumber: $myNumber) {
      items {
        ...MenuItemFields
        items {
          ...MenuItemFields
          items {
            ...MenuItemFields
            items {
              ...MenuItemFields
            }
          }
        }
      }
    }
  }
`;

menu.test.ts

import { useQuery } from '@apollo/react-hooks';
import {httpResponse as mockMenuAPIString} from '../../../../../mocks/expectations/Storm-Hub-Menu/storm-hub-menu.json';
import {getEligibleMenuEntries} from '../../../../server/modules/graphql/utils';
import {useMenu} from '../../services/menu'

it('returns valid Menu', () => {
    // Convert mockMenuAPI to mockMenu

    const mockMenuAPI = JSON.parse(mockMenuAPIString.body);
    const mockMenu = getEligibleMenuEntries(mockMenuAPI);      //Working

    ... How do I mock the useQuery?
    
    const res = useMenu(10000);

    expect(res).toEqual(mockMenu);
});

我尝试遵循the documentation,但是由于我没有返回任何HTML,仅返回结果,因此我实际上无法实现此功能。

In the example

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

您可以模拟@apollo/react-hooks模块。

jest.mock('@apollo/react-hooks', () => {
  
  const data = { menu }; // put your mock data here
  return {
    __esModule: true,
    useQuery: jest.fn(() => ({ data })),
  };
});

如果您还需要模拟其他方法(例如fetchMoreuseMutation)或直接模拟通过client.query执行的查询,也可以这样做。 This post提供了更多有关模拟其中每一者的详细信息。

答案 1 :(得分:0)

如果您的目标组件只有一个查询,

jest.mock('@apollo/react-hooks, () => {}) 非常好。但是,如果您根据不同的条件对一个组件有多个查询。您需要考虑使用 apollo 官方文档中的 MockedProvider。