Пример того, как проверить компонент, который использует useQuery?
У меня есть компонент React, который использует Apollo перехватывает lib useQuery
крюк. У меня проблемы с тестированием этого компонента. Вот моя текущая настройка.
import React from 'react';
import { BrowserRouter as Router } from 'react-router-dom';
import DashboardBar from './DashboardBar';
import { render, cleanup } from '@testing-library/react';
import { QUERY } from '../../queries';
import { ApolloClient } from 'apollo-client';
import { ApolloProvider as ApolloHooksProvider } from '@apollo/react-hooks';
import { MockedProvider } from 'react-apollo/test-utils';
import { InMemoryCache } from 'apollo-cache-inmemory';
import { MockLink } from 'apollo-link-mock';
import wait from 'waait';
import casual from 'casual';
describe('<DashboardBar />', () => {
it('renders and matches snapshot', async () => {
const mocks = [
{
request: { query: QUERY, variables: { id: 'WLYhM' } },
result: {
data: {
q: {
brand: fakeBrand,
claimByAction: casual.boolean,
claimRules: fakeClaimRules,
wantIn: fakeWantIn,
},
},
},
},
];
function createClient(mocks) {
return new ApolloClient({
cache: new InMemoryCache(),
link: new MockLink(mocks),
});
}
const client = createClient(mocks);
const { container } = render(
<ApolloHooksProvider client={client}>
<Router>
<DashboardBar {...props} store={reduxStore.store} />
</Router>
</ApolloHooksProvider>
);
console.log(container.firstChild);
expect(container.firstChild).toBe(null);
await wait(200);
console.log(container.firstChild);
});
});
Когда я запускаю тест, я получаю следующую ошибку
TypeError: Cannot read property 'q' of undefined
Несмотря на то, что данные возвращаются нормально в фактическом компоненте.
У кого-нибудь есть пример того, как успешно настроить и выполнить тесты с компонентами, используя хуки из библиотеки Apollo hooks lib?
Спасибо!
1 ответ
На самом деле мне удалось заставить это работать с помощью act()
Пример следующим образом:
import { MockedProvider } from '@apollo/react-testing'
import query from 'data/graphql/Device/psaButton.graphql'
import React from 'react'
import { act, create, ReactTestRenderer } from 'react-test-renderer'
import { MockAppNoLayout } from 'testHelpers/testHelpers'
import waitForExpect from 'wait-for-expect'
import PSAButton from './PSAButton'
const mocks = [
{
request: {
query,
variables: {
deviceId: '1',
},
},
result: {
data: {
deviceById: {
id: '1',
info: {
psaUrl: 'asdsadsad',
lastSyncDate: 'asdasd',
lastVerifyDate: 'asdsad',
},
},
user: {
timeZone: 'Europe/London',
},
},
},
},
]
describe('PSAButton', () => {
it('renders correctly', async () => {
let wrapper: ReactTestRenderer
act(() => {
wrapper = create(
<MockAppNoLayout>
<MockedProvider mocks={mocks} addTypename={false}>
<PSAButton deviceId="1" />
</MockedProvider>
</MockAppNoLayout>,
)
})
await waitForExpect(() => {
const testInstance = wrapper.root
expect(testInstance.findByType('span').children[0]).toBe('Open In PSA')
})
})
})
MockAppNoLayout
дерево компонентов React, содержащее amock IntlProvider
а также Styleprovider
и тому подобное, (не важно для этого вопроса).