如何在Jest中测试React Component我可以等到再次收到道具?

时间:2018-02-08 12:42:37

标签: reactjs testing jestjs

我需要测试一个HOC,它获取数据并将其传递给包装组件。

它会在几步中传递道具,因为数据是异步获取的。

第一波道具包含loading,我设法测试

第二波道具包含data道具,但我不知道等到它到达。我需要某种eventuallyHasProps的东西..

我正在使用Jest,react-test-renderer。

有没有办法实现这一点,避免设置手动超时?

由于

it(
  "first fetch results should be discarded",
  () => {
    // jest.useFakeTimers();

    const fetchMock = jest
      .fn()
      .mockImplementationOnce(() => {
        return new Promise(resolve => setTimeout(resolve(reqSuccess("slow")), 1000));
      })
      .mockImplementationOnce(() => {
        return new Promise(resolve => setTimeout(resolve(reqSuccess("fast")), 100));
      });

    const options = {
      url: props => `http://test.com${props.testArg}`,
      fetchApi: fetchMock
    };

    const WithFetch = withFetch(options)(component);

    // first request
    const testRenderer = renderer.create(<WithFetch />);

    // second request
    testRenderer.update(<WithFetch testArg="test" />);

    return new Promise((resolve, reject) => {
      setTimeout(() => {
        const resultTree = testRenderer.toTree();
        resolve(expect(resultTree.rendered.props.data.data.result).toBe("fast"));
      }, 4000);
    });

    // jest.runAllTimers();
  },
  5000
);

2 个答案:

答案 0 :(得分:2)

两个选项,使用异步测试:

it("should receive data prop", async () => {
  const someresult = await <Promise call>     
  const secondresult = await <Promise call>     
  expect(someresult).toHaveBeenCalledWith(something);
});

或者回复承诺:

it("should receive data prop", () => {
  return new Promise(resolve=> {
       // Your assertions (don't forget to call resolve)
  })
});

答案 1 :(得分:0)

尝试使用此处提到的done():https://alligator.io/testing/asynchronous-testing-jest/ 为我工作!而且没有计时器。