Jasmine测试:如何模拟特定日期且不影响指定日期的getTime计算?
如何在Jasmine测试中模拟特定日期?
通用模拟方案
如果只是需要全局让new Date()返回固定日期,最常用的方式是通过spyOn结合callFake替换window.Date的构造行为:
// 设定你需要模拟的目标日期 const mockDate = new Date('2024-06-01T00:00:00'); // 替换Date构造函数 spyOn(window, 'Date').and.callFake(() => mockDate);
这种方式能让所有new Date()调用返回你设定的日期,但会影响所有Date相关调用——包括带参数的new Date(dob),这也正是你第二个问题里的痛点。
针对「只模拟无参数new Date(),不影响带参数调用」的解决方案
你的getYears函数同时用到了两种Date调用:无参数的new Date()(获取当前时间)和带参数的new Date(dob)(解析出生日期)。要精准拦截无参数调用,我们可以在callFake里判断传入的参数数量,针对性返回结果:
// 第一步:定义模拟的当前日期 const mockCurrentDate = new Date('2024-01-01'); // 第二步:设置带有参数判断的spy spyOn(window, 'Date').and.callFake((...args) => { // 无参数调用时,返回模拟日期 if (args.length === 0) { return mockCurrentDate; } // 有参数时,使用原始的Date构造函数创建实例 // 这里用window.Date的原始实现,避免循环调用 return new window.Date(...args); }); // 第三步:测试你的getYears函数 it('should calculate correct years from dob', () => { const dob = '1990-01-01'; const result = getYears(dob); expect(result).toBe(34); // 2024-1990=34 }); // 第四步:测试后恢复原始Date,避免影响其他测试用例 afterEach(() => { window.Date.and.callThrough(); });
方案原理
- 当调用
new Date()(无参数)时,args.length为0,直接返回预设的模拟日期,完美实现“模拟当前时间”的需求。 - 当调用
new Date(dob)时,args包含传入的出生日期参数,此时我们用原始的Date构造函数创建实例,确保new Date(dob).getTime()能正确解析传入日期并返回对应时间戳,完全不受模拟逻辑干扰。
内容的提问来源于stack exchange,提问作者styler
相关产品推荐
相关产品推荐

