这个点击测试什么时候fail/pass

When does this click test fail/pass

我正在学习测试我的 React 组件。我有以下组件:

import React from 'react';
import PropTypes from 'prop-types';
import { firebase } from '../firebase';

export const Checkbox = ({ id, taskDesc }) => {
  const archiveTask = () => {
    firebase.firestore().collection('tasks').doc(id).update({
      archived: true,
    });
  };

  return (
    <div
      className="checkbox-holder"
      data-testid="checkbox-action"
      onClick={() => archiveTask()}
      onKeyDown={(e) => {
        if (e.key === 'Enter') archiveTask();
      }}
      aria-label={`Mark ${taskDesc} as done?`}
      role="button"
      tabIndex={0}
    >
      <span className="checkbox" />
    </div>
  );
};

在测试中,他们像这样测试 onClick 和 onKeyDown :

 it('renders the task checkbox and accepts a onClick', () => {
      const { queryByTestId } = render(
        <Checkbox id="1" taskDesc="Finish this tutorial series!" />
      );
      expect(queryByTestId('checkbox-action')).toBeTruthy();
      fireEvent.click(queryByTestId('checkbox-action'));
    });

但他只是点击它,并没有检查是否调用了 onClick 函数。此测试是否已经完成或还需要更多?

不清楚 jest 将如何确定此点击测试是通过还是失败。

在您的示例中,如果 Jest 找不到带有 data-testid="checkbox-action" 的元素,测试将失败。如果 Jest 找到一个,则测试通过。所以这个测试不是真的没用,而是它的价值可以提高。

要测试点击行为,您有 2 个选项:

设置一个 Checkbox 道具来提供点击处理程序,因此在您的测试中您可以只传递一个模拟函数 (jest.fn()),然后测试该模拟是否已被调用。所以你必须稍微修改你的 Checkbox 组件。

it('renders the task checkbox and accepts a onClick', () => {
  const mock = jest.fn();
  const { queryByTestId } = render(
    <Checkbox id="1" taskDesc="Finish this tutorial series!" onClick={mock}/>
  );
    
  expect(queryByTestId('checkbox-action')).toBeTruthy();
  fireEvent.click(queryByTestId('checkbox-action'));
  expect(mock).toHaveBeenCalled();
});

...或测试单击您的 Checkbox 组件的视觉结果,这将是“the React Testing Library way”(像真人一样测试:交互,视觉结果),但似乎没有任何变化单击时可见。