Jest — имитировать нажатие клавиши «Стрелка» и вызов функции

#reactjs #jestjs #enzyme

#reactjs #jestjs #фермент

Вопрос:

У меня есть компонент, который отображает ввод с помощью элементов управления. Элементы управления действуют как добавление / уменьшение значения на 1. У меня input с onKeyDown={handleKeyDown}

 const addUp = () => {
    let next = value   1;
    if (next > max) {
        next = max;
    }
    setValue(next);
    onChange(next);
};

const minusDown = () => {
    let next = value - 1;
    if (next < min) {
        next = min;
    }
    setValue(next);
    onChange(next);
};


function handleKeyDown() {
    const input = event.currentTarget;
    switch (event.key) {
        case "ArrowUp":
            addUp();
            break;
        case "ArrowDown":
            minusDown();
            break;
    }
    event.preventDefault();
}
 

Я хочу издеваться над handleKeyDown выше. Вот что я пробовал до сих пор:

   let defaultProps: Props;
  beforeEach(() => {
      defaultProps = {
          max: 100,
          min: 1,
          onChange: noop,
          value: 10,
      };
  });



describe("controls", () => {
    it("should call addUp and increase value", () => {
        const addUp = jest.fn();
        const wrapper = mount(<MyComponent {...defaultProps} />);
        const input = wrapper.find("input");
        input.simulate("keydown", { key: "ArrowUp", keyCode: 38, preventDefault() {}, which: 38 });

        expect(addUp).toBeCalledTimes(1);
        expect(input.prop("value")).toBe(11);
    });
});
 

это ошибка, которую я получаю:

 expect(jest.fn()).toBeCalledTimes(expected)

Expected number of calls: 1
Received number of calls: 0
 

У кого-нибудь есть какие-либо предложения о том, как это сделать правильно?

Ответ №1:

По .simulate() словам сопровождающих проекта, метод фактически устарел.

Предлагаемое решение состоит в том, чтобы использовать обработчики prop экземпляра компонента, которые будут запускать эти события; в данном случае это было бы wrapper.props().onKeyDown() . Это следует использовать вместо .simulate() .

Комментарии:

1. Как бы я нацелился на «стрелку» в этом случае?

2. Во-первых, вам необходимо указать event параметр в handleKeyDown определении вашей функции, чтобы его можно было использовать в теле функции. javascript function handleKeyDown(event) { // ... } Затем предоставьте event объекту-style свойства, к которым вы обращаетесь в теле вашей функции: javascript wrapper.props().onKeyDown({ key: "ArrowUp" })