Jest单元测试数据类型断言返回错误类型问题咨询
Jest单元测试类型判定异常原因
核心异常触发点
- 字段访问路径与实际响应结构不匹配
第一处报错的取值路径response.data.getPublicDisinfectionByProductStage2[0].details[0].nextSampleDateRange和你贴出的实际响应结构不符:你贴出的对应响应片段直接包含details数组,不存在外层数组包裹,额外添加的[0]索引会导致取值异常。如果路径中某一级取到null,typeof null会固定返回"object",直接触发“预期为string、实际为object”的报错。 - HTTP客户端自动转换了日期类型
如果你用的请求库(比如Axios)开启了响应自动日期转换,会把接口返回的符合格式的日期字符串自动序列化为JS原生Date实例,typeof Date实例的返回值就是"object",就会出现“接口返回JSON里是字符串,实际代码里拿到的值类型为object”的现象。 - catch块内断言写法不符合Jest语法规则
第二处报错分两层触发逻辑:- 第107行的类型断言先因为取值异常/类型不匹配抛出了Error实例(Error实例本身类型为object),触发了catch块逻辑
- catch块内的
expect(e).toMatch("error")写法本身有误:toMatch是字符串正则匹配器,仅支持接收字符串类型的校验值,传入object类型的Error实例时,Jest会直接抛出“接收值必须为字符串、实际类型为object”的匹配器错误。
修正方向
- 断言前先打印完整
response.data结构,对照修正字段访问路径,不要凭臆想加数组索引 - 检查请求库的响应转换配置,如果不需要自动转Date对象直接关闭即可;如果需要保留Date转换,把类型断言改为
expect(字段值).toBeInstanceOf(Date) - 不要手写try/catch包裹错误断言,Jest提供了专门的
.toThrow()匹配器做错误场景校验;如果确实要在catch里判断错误内容,要取Error实例的message属性做匹配,即expect(e.message).toMatch("error")
内容的提问来源于stack exchange,提问作者reactFullStackDeveloper
相关产品推荐
相关产品推荐

