0

今天我面临一个使用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不明白有重新渲染并且再次调用渲染道具。

有没有人遇到过这样的问题?谢谢 !

4

1 回答 1

0

当然,在询问之后,我终于偶然发现了错误/解决方案。

问题是没有运行计时器。

添加await jest.runAllTimers();和重置他们的模块

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

解决它 !

于 2019-02-25T10:26:19.370 回答