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

使用Jest的toMatchObject时,expect.toBeDefined()报错:不是函数

解决Jest中expect.toBeDefined()在toMatchObject里的报错问题

你的问题核心在于**toBeDefined是Jest的断言方法,不是匹配器**,而expect.any(Number)是专门用于对象结构匹配的合法匹配器,所以前者不能直接放在desiredResult对象里作为属性值使用。

两种可行的解决方式:

方式一:用expect.anything()替代(适用于只要求属性存在的场景)

如果delta只要存在(不为null或undefined)就行,不关心具体值,可以用expect.anything()——它是Jest官方支持的匹配器,能完美适配toMatchObject的结构匹配:

const desiredResult = { 
  host: '192.168.1.1', 
  port: expect.any(Number), 
  delta: expect.anything() 
}
expect(result).toMatchObject(desiredResult)

方式二:拆分断言,单独验证delta的定义状态

如果你需要更精准地确认delta是已定义状态(排除undefined,允许null),可以把对象结构匹配和单独的断言分开写:

const desiredResult = { 
  host: '192.168.1.1', 
  port: expect.any(Number) 
}
// 先匹配对象的固定结构和类型要求
expect(result).toMatchObject(desiredResult)
// 单独验证delta属性已定义
expect(result.delta).toBeDefined()

补充说明:为什么expect.any(Number)能正常工作?

expect.any(constructor)是Jest专为结构匹配设计的匹配器函数,它可以被放在对象属性值的位置,告诉Jest该属性需要匹配指定构造函数的实例类型。而toBeDefined()属于断言方法,必须直接调用在expect(目标值)之后,不能作为对象属性的值来使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:38:48