Почему функция jest mock не выполняется в моем тесте с библиотекой реагирования? - PullRequest
0 голосов
/ 07 февраля 2019

Проблема

Я создал очень простой пример кода для лучшего понимания.Вот код, который я хочу протестировать (содержащий простой ответный хук):

const TodoHeader = ({ handleSubmit }) => {
  const [value, setValue] = useState("");

  return (
    <form onSubmit={handleSubmit} data-testid="form">
      <input
        type="text"
        placeholder="Your Todo.."
        onChange={e => setValue(e.target.value)}
        value={value}
        data-testid="input"
      />
    </form>
  );
};

Я хочу проверить, выполнится ли переданная в handleSubmit проп.Итак, я настроил этот тест:

it("should call the passed in onSubmit function", () => {
    const mockFn = jest.fn();

    const { getByTestId } = render(
      <TodoHeader handleSubmit={mockFn} />
    );
    const form = getByTestId("form");
    fireEvent.submit(form);
    // This will fail (did not get executed)
    expect(mockFn).toHaveBeenCalled();
  });

Это как-то связано с реакционными хуками?Я также попытался изменить его, но тот же результат.Я не знаю, почему это не пройдет.Сообщение об ошибке:

Ожидается, что фиктивная функция была вызвана, но она не была вызвана.

Вот коды и окно, если вы хотите поиграться с ними:

https://codesandbox.io/s/ypok50n709 (TodoHeader.js и TodoHeader.test.js)

1 Ответ

0 голосов
/ 07 февраля 2019

Похоже, это простая проблема, cleanup на самом деле не вызывается afterEach.Это означает, что во время второго теста в document отображаются два элемента form, а первый возвращается getByTestId.

Измените

afterEach(() => cleanup)

на

afterEach(() => cleanup())

или просто

afterEach(cleanup)
...