错误:未实现:HTMLFormElement.prototype.submit

Ank*_*ita 7 forms typescript reactjs jestjs react-testing-library

这是我的测试用例的样子:

const renderCard = ({
  onSubmit = jest.fn(),
}: RenderCardParams = {}) => {
  return render(
        <Card title={title} onSubmit={onSubmit}>
          <Button type="submit">Save</Button>
        </Card>,
  );
}; 

it("should invoke onSubmit when form is submitted", async () => {
      const onSubmit = jest.fn();
      window.HTMLFormElement.prototype.submit = () => {};
      const { getByText } = renderCard({ onSubmit });
      const button = getByText("Save").closest("button");
      if (button) {
        fireEvent.click(button);
      }
      await wait(() => expect(onSubmit).toHaveBeenCalled());
 });
Run Code Online (Sandbox Code Playgroud)

我收到“错误:未实现:HTMLFormElement.prototype.submit”。我尝试了这里提到的解决方案https://github.com/jsdom/jsdom/issues/1937,但没有奏效。我不想消除错误而是正确执行测试。谢谢你。

dou*_*ell 9

我有一个类似的问题,通过调用该event.preventDefault()方法解决了。

我认为这需要在您的“onSubmit”函数中调用

const onSubmit = jest.fn(e => e.preventDefault());
Run Code Online (Sandbox Code Playgroud)

编辑:woops 忘了调用它!

  • 谢谢@doughellowell。遗憾的是,这在上述情况下不起作用。错误仍然存​​在。 (6认同)
  • 缺少括号 `submit = jest.fn(e =&gt; e.preventDefault())` (3认同)
  • 对我来说这有效 ```submit = jest.fn().mockImplementation((e) =&gt; e.preventDefault());``` (2认同)

twi*_*ity 9

我必须模拟onSubmit函数的实现来清除错误,从而防止默认的提交行为。

尝试一下这样的事情:

const onSubmit = jest.fn();


it("should invoke onSubmit when form is submitted", async () => {
      onSubmit.mockImplementation(event => {
        event.preventDefault();
      });

      const { getByText } = renderCard({ onSubmit });
      const button = getByText("Save").closest("button");
      if (button) {
        fireEvent.click(button);
      }
      await wait(() => expect(onSubmit).toHaveBeenCalled());
 });
Run Code Online (Sandbox Code Playgroud)

您可以在此处此处阅读有关 React 中的 event.preventDefault 的更多信息。

对我有用的其他方法是使用 RTL's fireEvent.submit,尽管您需要获得一个表单元素才能工作。假设您的实现Card以可识别的方式呈现表单getByRole,您也可以尝试如下操作:

fireEvent.submit(screen.getByRole('form'));
Run Code Online (Sandbox Code Playgroud)

这将代替模拟按钮单击,这在您的情况下可能是可以接受的,因为您似乎正在测试表单提交而不是按钮的行为。