You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用React Testing Library的userEvent.type时Slate的onChange未触发

问题:React Testing Library测试Slate编辑器时onChange未触发

使用React Testing Library(RTL)结合Jest测试Slate编辑器,调用userEvent.type模拟用户在编辑器中输入,期望触发Slate的onChange回调,但实际并未生效。该问题仅在测试环境中出现,正常浏览器环境下onChange可以正常触发。

编辑器代码

import React, { useState } from "react";
import { createEditor } from "slate";
import { Slate, Editable, withReact } from "slate-react";

const initialValue = [
  {
    type: "paragraph",
    children: [{ text: "Foo" }]
  }
];

export default function Editor({ onChange }) {
  const [editor] = useState(() => withReact(createEditor()));
  return (
    <Slate onChange={onChange} editor={editor} value={initialValue}>
      <Editable data-testid="my_editor" />
    </Slate>
  );
}

测试代码

import React from "react";
import "@testing-library/jest-dom/extend-expect";
import userEvent from "@testing-library/user-event";
import { render, screen } from "@testing-library/react";
import Editor from "../editor";

test("test", async () => {
  const user = userEvent.setup();
  const onChange = jest.fn();
  render(<Editor onChange={onChange} />);

  expect(screen.getByTestId("my_editor")).toHaveTextContent("Foo");

  user.type(screen.getByTestId("my_editor"), " some more text");

  // 以下尝试均未生效:
  // user.click(screen.getByTestId("my_editor"));
  // user.keyboard("bar");

  // fireEvent.change(screen.getByTestId("my_editor"), {
  //   target: { innerHTML: "<p>hello world</p>" }
  // });

  // fireEvent.blur(screen.getByTestId("my_editor"), {
  //   target: { innerHTML: "<p>hello world</p>" }
  // });

  expect(onChange).toHaveBeenCalled();
});

复现步骤

  • 打开tests/index.js
  • 运行测试
  • 断言onChange已被调用,但测试失败

内容的提问来源于stack exchange,提问作者George Eracleous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 18:52:15