Имитировать щелчок и получить возвращаемое значение состояния

#reactjs #typescript #jestjs #mocking #state

Вопрос:

У меня есть функциональный компонент, как показано ниже. Когда срабатывает кнопка Cta, она делает запрос к api, и если ответ успешен, состояние setFormsend изменяется на true.

 export const FormSend: React.FC<IProps> = (props) => {
  const [message, setMessage] = useReducer(
    (state: any, newState: any) => ({ ...state, ...newState }),
    new ISendMessageModel()
  );
  const [formSend, setFormSend] = useState<boolean>(false);
  const [formSendError, setFormSendError] = useState<boolean>(false);
  const [
    errors,
    validation,
    isGlobalValidation,
    triggerValidation,
  ] = useValidationErrors(serverModel, message);
  const [loading, setLoading] = useState<boolean>(false);

  const sendForm = async (evt: MouseEvent<HTMLAnchorElement>) => {
    setLoading(true);
    const isFormValid: boolean = triggerValidation();
    if (!isFormValid) {
      if (document.querySelectorAll(".error-block").length > 0) {
        scrollToFirstElement("error-block");
      }
      setLoading(false);
      return;
    }
    sendRequest();
  };
  const sendRequest = async () => {
    const formModel: ISendMessage = message;
    const response: AxiosResponse = await sendMessageAPI.sendMessage(formModel);
    if (response amp;amp; response.status === 200) {
      setFormSend(true);
      setLoading(false);
    } else {
      setFormSend(false);
      setFormSendError(true);
      setLoading(false);
    }
  };
  return (
    <div className="grid-content grid-content-3 col-md-6 mt-45">
      <Cta
        text="Senden"
        colorClass="color-cta-3"
        loading={loading}
        handleClick={sendForm}
        fullWidth={true}
      />
    </div>
  );
};
 

Я хочу поиздеваться над этим функциональным компонентом. До сих пор я реализовал приведенный ниже код.

 it("check return value", () => {
  const [formSend, setFormSend] = React.useState();

  const [isFetching, setFetching] = React.useState();
  reactMock.useState = setHookState({
    formSend: false,
    isFetching: false,
  });

  let wrapper = shallow(<FormSend />);

  wrapper.find("Cta").simulate("click");

  expect(setFormSend).toHaveBeenCalledTimes(1);
  console.log(wrapper.debug());
});
 

Однако это приводит к ошибке Недопустимого вызова крючка. Крючки могут вызываться только внутри тела компонента функции. Кроме того, я не уверен, что нахожусь на правильном пути. Как это возможно, чтобы имитировать щелчок Cta, а затем предположить, что api возвращает код состояния 200 и устанавливает значение setFormSend в true?