【问题标题】:react-testing-library: Render prop - Expected mock function to have been last called with: [false] But it was not calledreact-testing-library:渲染道具 - 预期的模拟函数最后一次调用:[false]但它没有被调用
【发布时间】:2019-02-25 10:06:16
【问题描述】:

今天我遇到了使用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.

如果我在if (loading) {} condition 之前添加props.children(false),它可以正常工作。

如果我在 index.js 中 console.log,我可以看到代码到达最后,即在 return props.children(someData) 之前,但 react-testing-library 不明白有重新渲染并且调用了渲染道具再一次。

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

【问题讨论】:

    标签: reactjs jestjs react-testing-library


    【解决方案1】:

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

    问题是计时器没有运行。

    添加 await jest.runAllTimers(); 并使用

    重置其模块
      beforeEach(() => {
        jest.resetModules();
      });
    

    修好了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      • 2019-03-28
      • 2020-08-31
      • 2020-08-30
      • 2021-07-16
      • 2020-12-01
      • 1970-01-01
      相关资源
      最近更新 更多