为什么用React测试库无法在测试中执行开玩笑的模拟功能?

时间:2019-02-07 17:33:03

标签: reactjs unit-testing testing jestjs react-testing-library

问题

我创建了一个非常基本的代码示例,以进行更好的说明。 这是我要测试的代码(包含简单的react hook):

const TodoHeader = ({ handleSubmit }) => {
  const [value, setValue] = useState("");

  return (
    <form onSubmit={handleSubmit} data-testid="form">
      <input
        type="text"
        placeholder="Your Todo.."
        onChange={e => setValue(e.target.value)}
        value={value}
        data-testid="input"
      />
    </form>
  );
};

我想测试传入的handleSubmit道具是否将被执行。所以我设置了这个测试:

it("should call the passed in onSubmit function", () => {
    const mockFn = jest.fn();

    const { getByTestId } = render(
      <TodoHeader handleSubmit={mockFn} />
    );
    const form = getByTestId("form");
    fireEvent.submit(form);
    // This will fail (did not get executed)
    expect(mockFn).toHaveBeenCalled();
  });

与反应挂钩有关吗?我也尝试过重新渲染,但结果相同。 我不知道为什么这不会过去。错误消息是:

  

预期已调用模拟函数,但未调用。

如果您想使用它,这里是一个代码框:

https://codesandbox.io/s/ypok50n709TodoHeader.jsTodoHeader.test.js

1 个答案:

答案 0 :(得分:3)

看起来这是一个简单的问题,cleanup实际上没有在afterEach中被调用。这意味着在第二次测试期间form中呈现了两个document元素,并且getByTestId返回了第一个元素。

更改

afterEach(() => cleanup)

任何一个

afterEach(() => cleanup())

或者只是

afterEach(cleanup)