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

测试时ToggleButtonGroup值无法获取?如何访问及初始化设置

问题分析与解决方案

一、组件渲染时的正确设置

先修正组件代码里的关键问题,确保ToggleButtonGroup的value属性正确绑定和更新:

1. 修正拼写错误

ToggleButtonGroup上的onChange属性存在拼写错误,需改为正确的回调函数名:

<ToggleButtonGroup 
  data-testid='alertButtonGroup'
  size='sm' 
  type="radio" 
  name="alerts"
  value={processAlerts}
  onChange={handleAlertChange} // 修正拼写错误
>

2. 匹配测试用的data-testid

测试代码中需要获取runningButton,但组件内第一个ToggleButton的data-testid不匹配,需调整:

<ToggleButton 
  data-testid='runningButton' // 改为测试中使用的ID
  id="tbg-radio-1" 
  value={'Y'}
  variant={outlineSuccess}
>
  Running
</ToggleButton>

3. 优化State初始化与更新逻辑

初始processAlerts设为空字符串会导致组件无默认选中项,建议和接口返回的默认值对齐,并简化更新逻辑:

// 初始值设为接口可能返回的默认值,比如'Y'
const [processAlerts, setProcessAlerts] = useState<string>('Y');
const [controls, setControls] = useState<any>({
  processAlerts: 'Y',
});

// 合并useEffect,避免重复更新
useEffect(() => {
  Service.getControls()
    .then(data => {
      setControls(data);
      setProcessAlerts(data.processAlerts);
    });
}, []);

二、测试时如何访问切换后的值

ToggleButtonGroup渲染后是一个div容器,本身没有value属性,真实的选中状态存储在内部的radio输入框中,可通过以下方式断言:

1. 修正测试代码中的元素获取

确保setup函数能正确获取目标元素:

const setup = () => {
  const utils = render(
    <BrowserRouter>
      <Page/>
    </BrowserRouter>
  );

  // 正确获取容器和按钮
  const buttonGroup = utils.getByTestId('alertButtonGroup');
  const runningButton = utils.getByTestId('runningButton');
  const suspendedButton = utils.getByTestId('suspendedButton');

  return {
    buttonGroup, runningButton, suspendedButton,
    ...utils
  }
}

2. 断言选中的Radio输入框

点击按钮后,对应的radio输入框会被标记为checked,可通过角色定位并断言:

test('should toggle alerts', async () => {
  const { runningButton, suspendedButton } = setup();

  // 点击运行按钮,断言对应radio被选中
  await fireEvent.click(runningButton);
  const runningRadio = screen.getByRole('radio', { name: /running/i });
  expect(runningRadio).toBeChecked();

  // 点击暂停按钮,断言状态切换
  await fireEvent.click(suspendedButton);
  const suspendedRadio = screen.getByRole('radio', { name: /suspended/i });
  expect(suspendedRadio).toBeChecked();
});

3. 可选:断言按钮的Active状态

Bootstrap的ToggleButton选中时会添加active类,也可通过这个类验证状态:

await fireEvent.click(runningButton);
expect(runningButton).toHaveClass('active');
expect(suspendedButton).not.toHaveClass('active');

4. Mock接口数据(可选)

如果组件依赖接口返回的初始值,测试时需mock接口避免真实请求:

jest.mock('./path/to/Service', () => ({
  getControls: jest.fn().mockResolvedValue({ processAlerts: 'N' }),
}));

// 测试前清空mock
beforeEach(() => {
  jest.clearAllMocks();
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:17:20