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

MUI Select测试:fireEvent触发act()错误与user.selectOptions失效问题

关于MUI Select组件单元测试的问题

组件代码

待测试的Select组件代码如下:

<FormControl fullWidth>
  <InputLabel id="demo-simple-select-label">
    {t("StrategyManager.Select_Action_Origin")}
  </InputLabel>
  <Select
    name="actionOrigin"
    label="Select Action Origin"
    id="operator-select"
    value={formik.values.actionOrigin}
    onChange={(event) => handleFormDataChange(event)}
    fullWidth
    inputProps={{
      id: "actionOrigin",
      "data-testid": "actionOrigin",
    }}
  >
    <MenuItem value={strategyActions.communications.value}>
      {t(strategyActions.communications.label)}
    </MenuItem>
    <MenuItem value={strategyActions.timer.value}>
      {t(strategyActions.timer.label)}
    </MenuItem>
    <MenuItem value={strategyActions.socials.value}>
      {t(strategyActions.socials.label)}
    </MenuItem>
  </Select>
</FormControl>;

测试问题描述

目前仅能通过fireEvent.change(actionOriginSelect, { target: { value: strategyActions.timer.value } });修改组件值,期望使用user.selectOptions(actionOriginSelect, strategyActions.timer.value)但无法更新目标输入框的值,因此只能沿用第一种实现方式。

测试可正常通过,但控制台会触发更新未包裹在act(...)中的错误提示。完整测试代码如下:

it("selects the timer option and reveals the action selector without showing a popup", async () => {
  const user = userEvent.setup();
  render(
    <ActionsDrawer/>,
  );

  const actionOriginSelect = screen.getByTestId("actionOrigin");
  expect(actionOriginSelect).toBeInTheDocument();

  // 可选中值但会触发控制台错误
  fireEvent.change(actionOriginSelect, {
    target: { value: strategyActions.timer.value },
  });

  // 更倾向使用这行代码,但actionOriginSelect的值不会变化
  // await user.selectOptions(actionOriginSelect, strategyActions.timer.value);

  const actionTypeSelect = screen.getByTestId("actionType");
  expect(actionTypeSelect).toBeInTheDocument();

  // 确认未显示确认模态框
  const changeOriginModal = screen.queryByText(
    "StrategyManager.Confirm_Change_Origin",
  );
  expect(changeOriginModal).toBeNull();
});

已尝试的解决方案

  • 将测试不同部分包裹在act()中,尝试定位需包裹的代码段
  • 尝试await引发错误的fireEvent
  • 在fireEvent后的断言中使用waitfor
  • 按照相关文章建议使用jest timers

上述方案均无法消除终端中的控制台警告。

请求帮助

恳请提供优化测试、实现user.selectOptions的建议;若无法实现,也请告知需将哪部分代码包裹在act()中以消除错误,帮助我更好地理解并规避此类问题。

内容的提问来源于stack exchange,提问作者Olivia Bates

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 02:46:07