Jest + React-testing-library - дождаться завершения фиктивной функции asyn c - PullRequest
0 голосов
/ 02 апреля 2020

My componentDidMount() запускает вызов асинхронной функции c, но в зависимости от результата этой функции это может не привести к изменению DOM. Можно ли как-нибудь дождаться завершения функции в моих тестах?

Вот пример - кнопка нажатия изначально отключена. Если функция asyn c возвращает 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() считается плохой практикой. Есть ли способ избежать этого?

1 Ответ

1 голос
/ 20 апреля 2020

В документах для waitFor рекомендуется просто подождать, пока ваша асин c функция .toHaveBeenCalled будет выглядеть так

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