response-testing-library: Render prop - Ожидаемая фиктивная функция для последнего вызова с: [false] Но она не была вызвана - PullRequest
0 голосов
/ 25 февраля 2019

Сегодня у меня возникла проблема с тестами, использующими 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 вызывается еще раз.

Кто-нибудь еще сталкивался с такой проблемой?Спасибо тебе!

1 Ответ

0 голосов
/ 25 февраля 2019

И, конечно же, сразу после запроса я наконец наткнулся на ошибку / решение.

Проблема заключалась в том, что таймеры не были запущены.

Добавление await jest.runAllTimers(); и сброс их модулей с помощью

  beforeEach(() => {
    jest.resetModules();
  });

исправлено!

...