Angular Jasmine测试中Date类型比较报错但日志显示值一致
问题原因
- 核心原因是Jasmine对比Date对象时会校验毫秒级时间戳,而测试日志默认打印Date时仅输出到秒级,隐藏了毫秒差异,因此你会看到日志中两个日期完全一致但比对失败。
- 你的测试代码在执行初始就实例化了
today = new Date(),而组件setActivateDate方法内部一般是在调用时才生成新的Date实例,两个实例的生成时间存在几到几十毫秒的差值,自然无法匹配。
可行解决方案
根据你的业务校验需求,可以选择以下任意一种方案:
- 直接比对时间戳(精确到毫秒)
如果业务要求两个日期完全等价,直接取Date对象的时间戳比对即可:
expect(component.activateDate.getTime()).toEqual(today.getTime());
- 按业务粒度忽略低精度差值
如果业务不需要校验到毫秒,可将两个日期统一取整到对应粒度后再比对,比如仅校验到秒级:
// 去掉毫秒部分,仅对比秒级及以上的时间 const getTimeSec = (date: Date) => Math.floor(date.getTime() / 1000); expect(getTimeSec(component.activateDate)).toEqual(getTimeSec(today));
- 固定全局时间(单元测试最优方案)
直接使用Jasmine内置的时钟API mock全局Date,避免时间随机波动的问题,测试结果更稳定:
it('myTest', () => { // 固定当前时间,后续所有new Date()调用都会返回该固定时间 const fixedDate = new Date('2021-11-17T20:28:54.000Z'); jasmine.clock().install(); jasmine.clock().mockDate(fixedDate); component.minDate = null; component.maxDate = null; spyOnProperty(component, 'isRange').and.returnValue(false); component['setActivateDate'](null); spyOn(component, <any>'verifyActivateDate').and.callThrough(); expect(component.activateDate).toEqual(fixedDate); // 测试结束后必须卸载mock时钟,避免影响其他测试用例 jasmine.clock().uninstall(); });
内容的提问来源于stack exchange,提问作者ramos jc
相关产品推荐
相关产品推荐

