【问题标题】:Coverage by Jest tests of a React component to call a function when a button is clickedJest 测试 React 组件的覆盖率以在单击按钮时调用函数
【发布时间】:2021-06-19 09:16:08
【问题描述】:

我有一个功能性的 React 组件,它呈现一个按钮,当单击该按钮时,会使用传递的参数从 props 调用 handleSave 函数。我尝试用测试覆盖组件,但我无法获胜,测试在控制台中崩溃,并出现未调用函数的错误。附上组件和测试代码:

// component
function Modal(props) {
  const { handleSave } = props;

  return (
    <button onClick={() => {handleSave('someInfo')}}>Save</button>
  )
}

// test
describe('ModalComponent', () => {
  it('should call handleSave function', () => {
    const onSaveClickMock = jest.fn();

    const component = mount(<Modal handleSave={onSaveClickMock} />);
    const button = component.find('button');
    button.simulate('click');
    expect(onSaveClickMock).toHaveBeenCalled();
  })
})

据我了解,如果将 handleSave 函数像这样直接传递给 onClick,则此测试实现将起作用:

<button onClick={handleSave}>Save</button>

当函数不只是传递给 onClick 属性,而是使用传递的参数调用时,如何实现测试?

【问题讨论】:

  • 你测试它完全一样。从测试的角度来看,重要的是handleSave 在正确的时间使用正确的参数被调用;例如,无论是 onClick={callback} 还是 onClick={event =&gt; callback(event)} 都没有关系。如果该测试未通过,则可能单击了其他按钮 - 对于此特定 minimal reproducible example,测试是否失败?
  • 是的,但在这种情况下,另一种方法 (toHaveBeenCalledWith()) 确实有帮助。不过还是谢谢
  • 您说 .toHaveBeenCalled 失败是因为根本没有调用该函数,那么如何通过使用特定参数调用它来测试它?

标签: javascript reactjs unit-testing jestjs enzyme


【解决方案1】:

好吧,有a helper method:toHaveBeenCalledWith()(别名 - toBeCalledWith()):

使用 .toHaveBeenCalledWith 确保调用了模拟函数 有具体的论据。

所以您的测试可能如下所示:

it('should call handleSave function with a predefined value', () => {
  const onSaveClickMock = jest.fn();
  const predefinedValue = 'someInfo';

  const component = mount(<Modal handleSave={onSaveClickMock} />);
  const button = component.find('button');
  button.simulate('click');
  expect(onSaveClickMock).toHaveBeenCalledWith(predefinedValue);
});

请注意,如果您确实向该函数发送预定义值,则应认真考虑将其抽象为常量(并在测试中导入此常量)。这样您就不必在需要时更新此值两次。

【讨论】:

  • @Max 做到了吗?因为这与您在 this 问题中报告的错误相同。
  • @jonrsharpe 是的,它帮助了我,但我在之前的评论中更详细地描述了。
  • @Max 每次你有一个新问题时,麻烦那些回答你以前问题的人是不好的形式,SO 上有很多其他用户。而且仍然不清楚这对您有什么帮助,因为您的新问题与此答案没有解决的问题完全相同。此外,您仍然过于简化了组件,因为正如我在那里评论的那样,测试通过了。
  • @jonrsharpe 虽然 OP 确实混淆了两件事,但出于某种原因,我一直认为它的关键部分不是错误,而是关于检查被调用者参数的问题。
猜你喜欢
  • 2020-06-03
  • 1970-01-01
  • 2021-01-09
  • 2018-12-11
  • 2019-12-22
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多