使用jest的mock函数模拟useQuery或useLazyQuery的返回值, 然后使用MockedProvider来包装测试组件。在测试中,我们需要wrap our component inside a MockedProvider 并且传入client 属性,这里使用mock的client.
示例代码:
import { MockedProvider } from '@apollo/client/testing';
import { useLazyQuery } from '@apollo/client';
const GET_USERS = gql`
query getUsers($id: ID!) {
user(id: $id) {
id
username
}
}
`;
describe('User component', () => {
const mocks = [
{
request: {
query: GET_USERS,
variables: {
id: 1,
},
},
result: {
data: {
user: {
id: 1,
username: 'testUser',
},
},
},
},
];
const mockUserComponent = () => {
const [getUsers, { data }] = useLazyQuery(GET_USERS, {
onCompleted: () => {
console.log('Data fetched');
},
});
return (
{data && {data.user.username}
}
);
};
it('fetches user data on button click', async () => {
const { getByText } = render(
{mockUserComponent()}
,
);
fireEvent.click(getByText(/get user/i));
await waitFor(() => {
expect(getByText(/testuser/i)).toBeInTheDocument();
});
});
});