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

如何用Enzyme断言禁用按钮点击时onClick事件不触发?

如何用Enzyme断言禁用按钮的onClick事件不触发

好问题!要验证处于禁用状态的按钮被点击时不会触发onClick事件,我们可以通过追踪事件处理函数的调用情况来实现,下面提供两种常用的方案:

方案一:将点击逻辑作为props传入(推荐,测试更清晰)

首先我们可以稍微调整组件,让onClick逻辑支持外部传入,这样测试时可以用Jest的mock函数来追踪调用:

修改后的sampleButton.jsx

import React from 'react';

// 允许外部传入onClick,默认保留原有的console.log逻辑
const SampleButton = ({ onClick = () => console.log('You clicked me!') }) => (
  <button disabled={true} onClick={onClick} test-attr="button" type="button">
    Click Me
  </button>
);

export default SampleButton;

对应的测试代码sampleButton.test.jsx

import React from 'react';
import { shallow } from 'enzyme';
import SampleButton from './sampleButton';

test('cannot click button if disabled', () => {
  // 创建一个Jest mock函数,用来追踪是否被调用
  const mockOnClick = jest.fn();
  
  // 渲染组件并传入mock函数作为onClick
  const wrapper = shallow(<SampleButton onClick={mockOnClick} />);
  const button = wrapper.find('[test-attr="button"]');
  
  // 模拟点击按钮
  button.simulate('click');
  
  // 核心断言:mock函数从未被调用过
  expect(mockOnClick).not.toHaveBeenCalled();
});

方案二:不修改原组件,mock控制台输出

如果不想改动原组件,我们可以通过mockconsole.log来验证它没有被触发(因为原组件的onClick是直接调用console.log):

测试代码sampleButton.test.jsx

import React from 'react';
import { shallow } from 'enzyme';
import SampleButton from './sampleButton';

test('cannot click button if disabled', () => {
  // 对console.log进行mock,替换为空实现
  const consoleLogSpy = jest.spyOn(console, 'log').mockImplementation(() => {});
  
  const wrapper = shallow(<SampleButton />);
  const button = wrapper.find('[test-attr="button"]');
  
  // 模拟点击按钮
  button.simulate('click');
  
  // 断言console.log没有被调用
  expect(consoleLogSpy).not.toHaveBeenCalled();
  
  // 恢复console.log的原始功能,避免影响其他测试
  consoleLogSpy.mockRestore();
});

原理说明

当按钮的disabled属性为true时,React会阻止onClick事件的触发,所以无论我们怎么模拟点击,对应的事件处理函数都不会被执行。通过追踪函数的调用状态,就能验证这个行为是否符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:10:41