Сегодня у меня возникла проблема с тестами, использующими react-testing-library
.
По какой-то причине react-testing-library
, похоже, не понимает, что реквизит рендера был вызван.Точнее, кажется, что он не рендерит потомков после первого рендеринга.
Код выглядит следующим образом (упрощенно)
index.test.js
// Simplified code, this is one test
jest.useFakeTimers();
const renderCallback = jest.fn();
const mockResolvers = {
// Some mock GraphQL resolvers
}
render(
<ReduxMockingProvider initialState={initialState}>
<ApolloMockingProvider mockResolvers={mockResolvers}>
<SomeComponent waitUntilResolved>
{renderCallback}
</SomeComponent>
</ApolloMockingProvider>
</ReduxMockingProvider>,
);
await jest.runAllTicks();
expect(renderCallback).toHaveBeenLastCalledWith(false);
index.js
<SomeComponent waitUntilResolved>
{(result) => {
const data = result.data;
return (
<SomeQueryComponent
query={someQueryHere}
variables={{
// Some variables from data
}}
>
{({ loading, error, data: someData }) => {
if (loading) {
return (props.waitUntilResolved) ? null : props.children({ loading });
}
if (error) return props.children(false);
return props.children(someData);
}}
</SomeQueryComponent>
);
}}
</SomeComponent>
К сожалению, когда я запускаю такой тест, он не проходит:
expect(jest.fn()).toHaveBeenLastCalledWith(expected)
Expected mock function to have been last called with:
[false]
But it was not called.
Если ядобавьте props.children(false)
до if (loading) {} condition
, он работает нормально.
Если я console.log
изнутри index.js, я вижу, что код достигает самого конца, то есть до return props.children(someData)
, но react-testing-library
не понимает, что есть рендер и что рендерprop вызывается еще раз.
Кто-нибудь еще сталкивался с такой проблемой?Спасибо тебе!