使用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
相关产品推荐
相关产品推荐

