如何使用Jest为接收yyyy-mm-dd日期参数的函数编写测试用例
函数改造与Jest测试实现
1 完善原函数逻辑
原函数首先需要修复两个基础问题,否则测试逻辑无法正常落地:
- 直接用
===对比两个Date对象会永远返回false,因为两者引用地址不同,需要转成同格式的字符串或时间戳再对比 - 缺少入参格式校验逻辑,先补充正则格式校验+日期有效性判断,避免无效参数进入后续逻辑
// 工具函数:校验是否为合法yyyy-mm-dd格式日期 function isValidDateFormat(dateStr) { // 先校验格式是否匹配yyyy-mm-dd规则 const reg = /^\d{4}-\d{2}-\d{2}$/ if (!reg.test(dateStr)) return false // 再校验日期本身合法(排除2024-02-30这类格式符合但实际不存在的日期) const date = new Date(dateStr) return date.toISOString().slice(0, 10) === dateStr } function dateFunction(dateStr) { // 入参格式校验,不符合直接抛出错误,方便测试捕获 if (!isValidDateFormat(dateStr)) { throw new Error('参数格式错误,请传入yyyy-mm-dd格式的合法日期') } // 统一取年月日部分对比,避免时分秒干扰日期匹配结果 const today = new Date().toISOString().slice(0, 10) const convertedDate = new Date(dateStr).toISOString().slice(0, 10) if (today === convertedDate) { return '日期匹配' // 替换为你要执行的业务逻辑 } else { return '日期不匹配' // 替换为你要执行的业务逻辑 } }
2 编写Jest测试用例
优先覆盖入参格式校验的测试点,再补充日期对比逻辑的测试,通过mock固定系统时间避免测试结果受实际运行日期影响:
describe('dateFunction 功能测试', () => { // 第一部分:入参格式校验测试 describe('入参格式校验规则', () => { test('合法yyyy-mm-dd格式日期不会抛出错误', () => { expect(() => dateFunction('2024-05-20')).not.toThrow() expect(() => dateFunction('2024-02-29')).not.toThrow() // 闰年合法日期场景 }) test('不符合规则的入参抛出格式错误', () => { expect(() => dateFunction('2024/05/20')).toThrow('参数格式错误') // 分隔符错误 expect(() => dateFunction('2024-5-20')).toThrow('参数格式错误') // 月日位数不足 expect(() => dateFunction('24-05-20')).toThrow('参数格式错误') // 年份位数不足 expect(() => dateFunction('abcd-05-20')).toThrow('参数格式错误') // 非数字日期 expect(() => dateFunction('2024-02-30')).toThrow('参数格式错误') // 无效日期 expect(() => dateFunction('2024-13-20')).toThrow('参数格式错误') // 月份超出范围 expect(() => dateFunction('2024-05-32')).toThrow('参数格式错误') // 日期超出范围 }) }) // 第二部分:日期对比逻辑测试 describe('日期匹配逻辑', () => { // 测试前固定系统时间为2024-05-20,避免实际日期变化影响测试结果 beforeEach(() => { jest.useFakeTimers().setSystemTime(new Date('2024-05-20')) }) // 测试后恢复系统正常时间 afterEach(() => { jest.useRealTimers() }) test('传入当日日期返回匹配结果', () => { expect(dateFunction('2024-05-20')).toBe('日期匹配') }) test('传入非当日日期返回不匹配结果', () => { expect(dateFunction('2024-05-19')).toBe('日期不匹配') expect(dateFunction('2024-05-21')).toBe('日期不匹配') }) }) })
内容的提问来源于stack exchange,提问作者Akshay Kashid
相关产品推荐
相关产品推荐

