You need to enable JavaScript to run this app. 如何使用Jest为接收yyyy-mm-dd日期参数的函数编写测试用例
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 02:45:03