我需要测试一个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
);
答案 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/ 为我工作!而且没有计时器。