Jest + React-testing-library-等待模拟的异步功能完成

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jest + React-testing-library-等待模拟的异步功能完成相关的知识,希望对你有一定的参考价值。

我的componentDidMount()触发了对异步函数的调用,但是取决于该函数的结果,它可能不会导致任何DOM更改。有什么方法可以等待我的功能在测试中完成?

这里是一个示例-最初禁用了单击按钮。如果异步函数返回true,则应启用单击按钮:

    myAsyncFunction.mockImplementation(() => true);
    const queryByText = render(<Component />);
    const button = queryByText("Click");
    expect(button).toBeDisabled();
    await waitFor( () => expect(button).not.toBeDisabled() );
    expect(button).not.toBeDisabled();

但是如果返回false,则按钮保持禁用状态:

    myAsyncFunction.mockImplementation(() => false);   // async returning different value
    const queryByText = render(<Component />);
    const button = queryByText("Click");
    expect(button).toBeDisabled();
    await waitFor( () =>  );                       //        <== **** CODE SMELL ****
    expect(button).toBeDisabled();

第二项测试确实有效,但是空的waitFor()被认为是不良做法。有什么办法可以避免这种情况?

答案

waitFor的文档中,建议像这样等待异步函数.toHaveBeenCalled

await waitFor(() => expect(mockAPI).toHaveBeenCalledTimes(1))

以上是关于Jest + React-testing-library-等待模拟的异步功能完成的主要内容,如果未能解决你的问题,请参考以下文章

单元测试jest部署

jest中的mock,jest.fn()jest.spyOn()jest.mock()

jest中的mock,jest.fn()jest.spyOn()jest.mock()

Jest-vue 和 Vue-jest 有啥区别?

jest 忽略某些jest文件

如何仅通过一个 Jest 配置文件/设置使用多个 Jest 预设?