Имитация щелчка с помощью фермента, похоже, не обновляет состояние в родительском компоненте

#javascript #reactjs #jestjs #enzyme

Вопрос:

Я пытаюсь выполнить тест высокого уровня, в котором я запускаю:

 describe("<App/>", () => {
  let wrapper;
  const setState = jest.fn();
  const useStateSpy = jest.spyOn(React, "useState");
  useStateSpy.mockImplementation((init) => [init, setState]);

  beforeEach(() => {
    wrapper = mount(<App />);
  });

  afterEach(() => {
    jest.clearAllMocks();
  });

  it("updates components in state when an option is clicked", () => {

    act(() => {
      wrapper
        .find(".component-options__component-option")
        .at(1)
        .simulate("click");
    });

    expect(setState).toHaveBeenCalledWith({
      ...testComponents,
      [componentType.SCREEN]: "15-retina",
    });
  });
});

 

Который действует на компонент, возвращающий следующее:

     <li className={"component-options__component-option"} onClick={click} key={item.name}>
      <span className="component-option__name">{item.name}</span>
      <span className="component-option__price">£{item.price}</span>
    </li>
 

click опора здесь успешно вызывает функцию в приложении, которая представляет собой несколько уровней li компонента в моей иерархии компонентов. Я знаю, потому что это обновляет мой пользовательский интерфейс! По какой-то причине, хотя при попытке реализовать и протестировать ту же логику в тестовой среде мне говорят:

   ● <App/> › updates components in state when an option is clicked

    expect(jest.fn()).toHaveBeenCalledWith(...expected)

    Expected: {"cpu": "quad-i7-27-base", "graphics": "rad-pro-455", "memory": "8gb-mem", "screen": "15-retina", "storage": "512-ssd"}

    **Number of calls: 0**

      45 |     });
      46 | 
    > 47 |     expect(setState).toHaveBeenCalledWith({
         |                      ^
      48 |       ...testComponents,
      49 |       [componentType.SCREEN]: "15-retina",
      50 |     });

      at Object.<anonymous> (src/__tests__/App.test.js:47:22)

 

Таким образом, либо мой клик не регистрируется (я перепробовал несколько других методов выполнения этого клика), либо я пропускаю шаг для правильного обновления компонентов? Я не уверен.