У меня есть компонент Dashboard
, который содержит дочерний компонент, например. Child
, который использует ответный запрос.
У меня есть существующий модульный тест для компонента Dashboard
, который начал давать сбой, ошибка:
TypeError: queryClient.defaultQueryObserverOptions is not a function
38 | const { locale } = React.useContext(LocaleStateContext);
39 | const options = getOptions(locale);
> 40 | return useQuery(
| ^
41 | rqKey,
42 | async () => {
43 | const result = await window.fetch(url, options);
Фрагмент из теста:
const queryClient = new QueryClient();
const { getByTestId, getByRole } = render(
<IntlProvider locale="en" messages={messages}>
<QueryClientProvider client={queryClient}>
<Dashboard />
</QueryClientProvider>
</IntlProvider>,
);
Прочитал документацию по тестированию:
https://react-query.tanstack.com/guides/testing#our-first-test
Но я не хочу обязательно использовать renderHook
, поскольку меня не интересует результат.
РЕДАКТИРОВАТЬ:
Компонент Child
использует функцию:
export function usePosts({ rqKey, url, extraConfig }: CallApiProps) {
const { locale } = React.useContext(LocaleStateContext);
const options = getOptions(locale);
return useQuery(
rqKey,
async () => {
const result = await window.fetch(url, options);
const data = await result.json();
return data;
},
extraConfig,
);
}
Что называется так:
const { data, error, isFetching, isError } = usePosts({
rqKey,
url,
extraConfig,
});
Исходя из вашего ответа, я должен создать отдельную функцию:
async () => {
const result = await window.fetch(url, options);
const data = await result.json();
return data;
},
e.g.
export async function usePosts({ rqKey, url, extraConfig }: CallApiProps) {
const { locale } = React.useContext(LocaleStateContext);
const options = getOptions(locale);
return useQuery(
rqKey,
await getFoos(url, options),
extraConfig,
);
}
А потом поиздевайтесь над этим в тесте.
Если я это сделаю, то как тогда я получу доступ к: error, isFetching, isError
Поскольку usePosts()
теперь вернет Promise<QueryObserverResult<unknown, unknown>>
РЕДАКТИРОВАТЬ 2:
Я попытался упростить свой код:
export async function useFetch({ queryKey }: any) {
const [_key, { url, options }] = queryKey;
const res = await window.fetch(url, options);
return await res.json();
}
Что затем используется как:
const { isLoading, error, data, isError } = useQuery(
[rqKey, { url, options }],
useFetch,
extraConfig,
);
Все работает.
Затем в тесте Dashboard
я делаю следующее:
import * as useFetch from ".";
а также
jest.spyOn(useFetch, "useFetch").mockResolvedValue(["asdf", "asdf"]);
а также
render(
<IntlProvider locale="en" messages={messages}>
<QueryClientProvider client={queryClient}>
<Dashboard />
</QueryClientProvider>
</IntlProvider>,
);
Что затем возвращается:
TypeError: queryClient.defaultQueryObserverOptions is not a function
78 | const { locale } = React.useContext(LocaleStateContext);
79 | const options = getOptions(locale);
> 80 | const { isLoading, error, data, isError } = useQuery(
| ^
81 | [rqKey, { url, options }],
82 | useFetch,
83 | extraConfig,