Angular Jasmine单元测试模拟Router后toDate方法报错如何解决
错误原因
这个报错的核心是你模拟的tournamentData对象中expiry_date字段没有挂载toDate方法,你直接传入了普通日期值、时间戳或字符串,调用不存在的方法自然会抛出异常。
解决方案
方案1:直接在模拟数据中定义toDate方法
直接给expiry_date新增带返回值的spy方法即可,代码示例:
const tournamentData = { // 其他原有字段保留 expiry_date: { toDate: jasmine.createSpy('toDate').and.returnValue(new Date('2024-05-20 10:30:00')) // 替换为你测试需要的目标日期 } }
方案2:复用原有expiry_date值做包装
如果你已经提前定义了tournamentData.expiry_date的原有值,不想修改基础定义,可以在初始化mockRouter之前做包装:
// 假设原有tournamentData.expiry_date是普通Date类型,包装后保留原有值作为toDate的返回值 tournamentData.expiry_date = { ...tournamentData.expiry_date, toDate: jasmine.createSpy('toDate').and.returnValue(tournamentData.expiry_date) }
原spyOn报错说明
你之前用spyOn失败是因为spyOn只能对已经存在的方法做打桩,不能给对象新增不存在的属性/方法,直接给expiry_date定义带toDate的结构是最直接的解决方式。
修改完成后重新运行测试,expiry_date.toDate()会返回你预设的Date对象,datePipe.transform就可以正常处理不会抛出异常。
内容的提问来源于stack exchange,提问作者cakePHP
相关产品推荐
相关产品推荐

