【问题标题】:Testing Library - Test onChange not called测试库 - 未调用测试 onChange
【发布时间】:2020-07-14 17:24:19
【问题描述】:

我遇到了以下问题 - 我需要编写一个测试来检查如果单击相同的值,是否不执行 onChange

这里是 onChange:

const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
if (sameValueClicked) return; 

setValue(event.target.value)
};

这是我迄今为止的测试:

it('Does not call onChange if same value selected', async () => {
  render(
    <ValuePicker
      value={"1st"}
      onChange={jest.fn()}
    />
  );

  fireEvent.click(screen.getByLabelText('Value Picker'));
  await waitFor(() => screen.getByRole('dialog'));

  fireEvent.click(screen.getByLabelText('1st'));
  expect(screen.queryByRole('dialog')).toBeInTheDocument();
});

现在,如果正在打开的对话框保持打开但不是最佳解决方案,则测试通过。

有什么想法吗?

【问题讨论】:

  • 显示更多上下文:sameValueClickedsetValue() 是什么?
  • 需要明确的问题陈述。 正在打开的对话框保持打开状态 - 这是什么意思? 这不是最佳解决方案 - 最佳解决方案是什么样的,它到底有什么问题?
  • @k-wasilewski: sameValueClicked 是一个布尔字段,指示是否与单击当前值相同。 setValue 是一个设置当前值的函数。 @EstusFlask:选择一个值后,显示值的对话框应该关闭。我想象可选的解决方案是:if the same value is clicked, make sure onChange is not executed.
  • 我的意思是:向我们展示setValue() 的实现。无论如何,您可以测试一个函数是否被调用,正如@Muhammad Ali 所建议的那样。

标签: reactjs typescript jestjs react-testing-library


【解决方案1】:

将您的点击事件封装在act 中,然后测试功能。

import { act } from 'react-dom/test-utils';

// ...

it('Does not call onChange if same value selected', async () => {
  const onChange = jest.fn()
  render(
    <ValuePicker
      value={"1st"}
      onChange={onChange}
    />
  );

  act(() => fireEvent.click(screen.getByLabelText('Value Picker')));
  act(() => fireEvent.click(screen.getByLabelText('1st')));
  expect(onChange).not.toHaveBeenCalled();
});

【讨论】:

  • 也许我不够清楚。我希望删除expect(screen.queryByRole('dialog')).toBeInTheDocument() 并根据其他内容判断测试。
  • 是的,您可以测试值是否已更改以及是否正在调用该函数。让我稍微修改一下答案。
  • 编辑了不调用函数行为的答案,您可以测试是否正在调用该函数,即toHaveBeenCalled,更合适的是toHaveBeenCalledWith,并测试传递的参数。
  • 不是这样,fireEvent内部已经调用了act。
  • 我可以确认它确实有效 :) 即使没有 act()。谢谢!
猜你喜欢
  • 2021-02-22
  • 2020-03-08
  • 1970-01-01
  • 2021-12-30
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-26
  • 2021-07-03
相关资源
最近更新 更多