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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:48:02