網站搜尋

reactjs - 錯誤:未實作:HTMLFormElement.prototype.submit


這就是我的測試案例的樣子:

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());
 });

我收到了「錯誤:未實現:HTMLFormElement.prototype.submit」。我嘗試了這裡提到的解決方案 https://github.com/jsdom/jsdom/issues/1937,但它不起作用。我不想忽略這些錯誤,而是想正確地實現測試。

答案#1

我遇到過類似的問題,是透過呼叫 event.preventDefault() 方法解決的。

我覺得這需要在你的 'onSubmit' 函數中被調用

const onSubmit = jest.fn(e => e.preventDefault());

編輯:哎呀,忘了呼叫它了!😅

答案#2

我必須模擬我的 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());
 });

你可以在這裡和這裡閱讀更多有關 React 中 event.preventDefault 的內容。

對我有用的另一個方法是使用 RTL 的 fireEvent.submit,不過你需要取得一個表單元素才能使用它。假設你的 Card 實作以一種 getByRole 可以辨識的方式呈現表單,你也可以嘗試像這樣的做法:

fireEvent.submit(screen.getByRole('form'));

這將取代模擬按鈕點擊,在你的情況下可能是可以接受的,因為你似乎是在測試表單提交而不是按鈕的行為。