Angular 4+中Moment.js endOf('day')测试时间不符问题求助
解决Jasmine测试中moment.endOf('day')时区不一致的问题
这个问题我之前也碰到过,核心原因是测试环境与应用运行环境的时区设置不匹配,导致moment计算"一天结束"的结果出现差异。下面是几个靠谱的解决办法:
方法1:全局设置moment使用UTC模式
如果你的Angular应用中moment默认使用UTC(比如服务器端运行在UTC时区,或代码里全局开启了UTC模式),那在测试中也强制moment对齐这个设置:
在测试文件的beforeEach块中添加代码:
import * as moment from 'moment'; beforeEach(() => { // 全局开启moment的UTC模式 moment.useUTC(true); });
这样moment().endOf('day')就会返回UTC时区的当日最后一刻(T23:59:59.999Z),和应用中的结果完全一致。
方法2:直接在测试中使用UTC模式创建moment对象
如果应用中的代码其实隐含依赖了UTC模式(比如某些场景下用了moment.utc()),那在测试里直接调用UTC版本的方法即可:
// 测试中替换成utc模式的调用 const endOfDay = moment.utc().endOf('day'); expect(endOfDay.format()).toBe('2018-03-06T23:59:59.999Z');
方法3:用moment-timezone固定时区(适合多时区场景)
如果你的项目引入了moment-timezone,可以直接设置默认时区为UTC:
import * as moment from 'moment-timezone'; beforeEach(() => { moment.tz.setDefault('UTC'); });
这个方法灵活性更高,后续需要测试其他时区的场景也能直接切换。
额外小技巧:固定测试日期
为了避免测试结果随当前日期变化而失效,建议在测试中固定moment的当前时间:
beforeEach(() => { // 固定当前时间为2018-03-06 spyOn(moment, 'now').and.returnValue(moment('2018-03-06').valueOf()); moment.useUTC(true); });
这样不管哪天跑测试,moment().endOf('day')都会返回预期的2018-03-06T23:59:59.999Z,测试稳定性拉满。
内容的提问来源于stack exchange,提问作者coderman
相关产品推荐
相关产品推荐

