我目前正在尝试从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,仅返回结果,因此我实际上无法实现此功能。
任何帮助将不胜感激。
答案 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 })),
};
});
如果您还需要模拟其他方法(例如fetchMore
,useMutation
)或直接模拟通过client.query
执行的查询,也可以这样做。 This post提供了更多有关模拟其中每一者的详细信息。
答案 1 :(得分:0)
jest.mock('@apollo/react-hooks, () => {})
非常好。但是,如果您根据不同的条件对一个组件有多个查询。您需要考虑使用 apollo 官方文档中的 MockedProvider。