не удалось получить тестовое покрытие метода внутри componentDidUpdate

Я тестирую компонент класса reactjs с помощью фермента, и я не могу настроить таргетинг на этот вызов одной функции.

ClassComponentFile.jsx

componentDidUpdate(prevProps, { layout: prevLayout }) {
  const { setData, interaction } = this.props;

console.log('prevProp', prevProps.interation.data.requestSuccessful)
console.log('current Value',this.props.interation.data.requestSuccessful)


  if (prevProps.interaction.data.responseSuccessful
    !== interaction.data.responseSuccessful) {
     console.log('here');
    this.proceedToNextModuleClick();  <-- This Function Call
  }
}

Тестовый файл

const PROPS = {
...
  interaction: {
    data: {},
  },
...
};

  it('should call invoke proceedToNextModuleClick', () => {
    const wrapper = mount(<ServicingPortalLayoutController {...PROPS} />);

    const initialLayout = getInitialLayout({
      proceedToNextModuleClick: jest.fn(),
    }); 

    wrapper.setState({ layout: initialLayout });
    const proceedMock = jest.spyOn(wrapper.instance(), 'proceedToNextModuleClick');

    const newProps = PROPS;
    newProps.interaction.data = { responseSuccessful: true };
    wrapper.setProps(newProps);

    expect(proceedMock).toHaveBeenCalledTimes(1);
  });

«Здесь» console.log никогда не вызывается. В первый раз, когда компонент выполнил обновление, вызывается prevProps и текущее значение, оба являются ложными, а затем в следующий раз, когда он вызывается, оба значения являются истинными, что означает, что он никогда не удовлетворяет условию для достижения метода.

Я тоже пробовал это wrapper.instance().componentDidUpdate(PROPS, initialLayout); С этим тоже не повезло.

Есть ли что-то, что мне не хватает в setProps? или какое-либо объяснение такого поведения как предыдущего, так и текущего реквизита одинаково?


person Austin Callaghan    schedule 21.05.2020    source источник


Ответы (1)


Я думаю, что когда вы делаете const newProps = PROPS;, вы не копируете объект, а используете ту же ссылку. Вы меняете кое-что внутри, но проверки на равенство поверхностны, поэтому компонент не обновляется, потому что видит тот же объект реквизита, что и раньше.

Попробуйте const newProps = {...PROPS}; проверить, не в этом ли проблема.

person JulienD    schedule 21.05.2020