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

Jest mock类方法报Argument not assignable ts(2345)错误如何解决

问题根因

你的写法存在两个核心错误,刚好对应两个TS报错:

  • 你要mock的consentGiven是用类字段+箭头函数定义的实例自有属性,不是挂载在类原型上的共享方法,也不是类的静态属性。jest.spyOn(ReissueButton, 'consentGiven') 是在类构造函数本身的静态属性里查找目标方法,类静态侧只存在prototype、contextType(React类组件内置静态属性)这类成员,自然找不到consentGiven,触发第一个类型报错。
  • 原consentGiven是同步返回布尔值的普通函数,你却用了mockResolvedValue做返回值mock——这个API是专门用来mock异步返回Promise的方法的,就算spy目标正确,返回值类型也完全不匹配,触发第二个类型报错。
修复方式

根据你的单测场景选对应方案即可:

场景1:可以拿到组件实例

如果你用enzyme这类可以直接拿到组件实例的测试库,直接在实例上spy,同步方法用mockReturnValue设置返回值:

// 先渲染组件拿到实例
const wrapper = mount(<ReissueButton policy="test-policy" />);
const componentInstance = wrapper.instance() as ReissueButton;

// 监听实例上的方法,mock同步返回值
const consentSpy = jest.spyOn(componentInstance, 'consentGiven').mockReturnValue(true);

场景2:拿不到组件实例(比如用React Testing Library)

类字段箭头函数会在实例初始化时遮蔽原型上的同名属性,所以需要提前在原型上注入mock函数,再做spy:

// 提前在原型上挂载mock函数,避免实例初始化覆盖
(ReissueButton.prototype as unknown as { consentGiven: () => boolean }).consentGiven = jest.fn();
// 监听原型上的方法,mock返回值
const consentSpy = jest.spyOn(ReissueButton.prototype, 'consentGiven').mockReturnValue(true);

// 之后再正常渲染组件即可
render(<ReissueButton policy="test-policy" />);

注意:不要用mockResolvedValuemock这个方法,否则调用后会得到Promise<boolean>,和原方法同步返回布尔值的逻辑不一致,会导致单测逻辑错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:36:20