Jest教程:如何测试对象的可选属性
如何在Jest中断言包含可选属性的对象?
嘿,这个问题我之前也碰到过!刚好可以给你两个靠谱的解决方案,看你用的Jest版本来选就行~
方案一:使用Jest 29+的expect.optional(推荐)
Jest 29及以上版本专门提供了expect.optional()API,完美适配这种可选属性的校验场景——属性存在时必须符合指定规则,不存在时也不会触发断言失败。
你只需要修改obj1的定义,把age用expect.optional()包裹起来:
const obj1 = { name: expect.any(String), age: expect.optional(expect.any(Number)) }; // 直接沿用你原来的断言语句即可 expect(response).toMatchObject(obj1);
这样不管后端返回的response里有没有age属性,只要存在时是数字类型,断言就会通过;如果age存在但不是数字,就会触发断言失败,完全匹配你的需求。
方案二:兼容旧版Jest(Jest < 29)
如果你还在使用Jest 29以下的版本,没有expect.optional(),可以分两步处理:先断言必填属性,再对可选属性做条件校验:
// 先断言必须存在的name属性符合要求 expect(response).toMatchObject({ name: expect.any(String) }); // 检查如果age存在,必须是数字类型 if ('age' in response) { expect(typeof response.age).toBe('number'); }
这种方式虽然多了一行代码,但兼容性更好,逻辑也足够清晰。
内容的提问来源于stack exchange,提问作者Shiyu Wang
相关产品推荐
相关产品推荐

