JS不靠谱系列: 写一个验证过期时间的函数,包含jest单元测试

简介: 我们经常用到的token还是cookie,都默认有一个过期时间我们做鉴权的时候,很依赖这个,所以捣鼓下能不能再严谨点因为之前都是以后台固定的格式,直接拿到值做一个简单的判断;那,假如后台传过来的日期格式变了呢!!有兴趣的瞧瞧。


前言


我们经常用到的token还是cookie,都默认有一个过期时间


我们做鉴权的时候,很依赖这个,所以捣鼓下能不能再严谨点


因为之前都是以后台固定的格式,直接拿到值做一个简单的判断;


那,假如后台传过来的日期格式变了呢!!有兴趣的瞧瞧。


前置基础


  • jest : 这个测试框架非常不错,Facebook 出品
  • ES5&&ES6
  • Typescript


我们不讲配置,也不讲其他琐碎,只说实现过程


思路分析


重心其实就是围绕传参来执行


  • 判断参数的类型,只考虑两种情况
  • 数字: 验证是否为一个正确的时间戳!!!!
  • 字符串: 验证是否是一个datetime格式,亦或者可以转换成识别的格式(比如 2018/08/01)
  • 类型的转换及比较
  • 最后返回布尔值,来确定该值是否有效


效果图



代码实现


代码不多,只涵盖了这么几种情况,具体看测试的文字描述


js 版本


isDate.js , 暴露isDate函数,接收一个参数


function checkDateTime(d) {
  const _date = new Date(d);
  const Now = new Date().getTime();
  const DiffTime = _date.getTime() - Now;
  if (
    _date.getFullYear() === 1970 ||
    _date.getFullYear() < new Date().getFullYear()
  ) {
    // 若是传入的时间转换成1970年...那肯定不是我们后台要传的时间
    // 小于这个年份的也必然不是,谁的后台token过期时间超过一年的...
    return false;
  }
  if (DiffTime > 60000) {
    // 过期结束时间必须大于传入时间
    // 当过期时间还大于一分钟的时候,
    return true;
  } else {
    // 否则返回false,从外部调用这个函数拿到返回值,
    // 做二步处理,续期还是强制退出什么鬼的
    return false;
  }
}
/**
 * @description 判断是否为正确的日期
 * @param {*} d
 */
export const isDate = d => {
  // 任何不能给Date识别的参数,子函数调用的返回值为NaN
  return isNaN(new Date(d).getTime()) || new Date(d).getTime() === 0
    ? false
    : checkDateTime(d);
};


ts版本


在vscode会有提示错误


DateConstructor: Argument of type 'string | number' is not assignable to parameter of type 'string'.


大体上说日期类型没法赋值字符串类型的值,这个问题似乎等待修复,我在Github上找了,

github.com/Microsoft/T…,


有人提交了PR,不知道有没有合并进去..


github.com/Microsoft/T…


function checkDateTime(d: number | string): boolean {
  const _date: Date = new Date(d);
  const Now: number = new Date().getTime();
  const DiffTime: number = _date.getTime() - Now;
  if (
    _date.getFullYear() === 1970 ||
    _date.getFullYear() < new Date().getFullYear()
  ) {
    // 若是传入的时间转换成1970年...那肯定不是我们后台要传的时间
    // 小于这个年份的也必然不是,谁的后台token过期时间超过一年的...
    return false;
  }
  if (DiffTime > 60000) {
    // 当过期时间还大于一分钟的时候,
    return true;
  } else {
    // 否则返回false,从外部调用这个函数拿到返回值,
    // 做二步处理,续期还是强制退出什么鬼的
    return false;
  }
}
/**
 * @description 判断是否为正确的日期
 * @param {*} d
 */
export const isDate = (d: string | number) => {
  // 任何不能给Date识别的参数,子函数调用的返回值为NaN
  return isNaN(new Date(d).getTime()) || new Date(d).getTime() === 0
    ? false
    : checkDateTime(d);
};


测试代码


import { isDate } from "../../src/utils/isDate";
describe("isDate函数测试集合组", () => {
  test("這種非標準的時間戳只會轉成1970這種,已經過期", () => {
    expect(isDate(21312445)).toBe(false);
  });
  test("已經過期", () => {
    expect(isDate(1533097116565)).toBe(false);
  });
  test("已經過期", () => {
    expect(isDate(1514764800000)).toBe(false);
  });
  test("传入undefined为false,不传参就是undefined", () => {
    expect(isDate(undefined)).toBe(false);
  });
  test("传入null虽然返回0,但也是false", () => {
    expect(isDate(null)).toBe(false);
  });
  test("標準格式的返回true", () => {
    expect(isDate("2018-12-01")).toBe(true);
  });
  test("標準格式的返回true", () => {
    expect(isDate("2018/8/09")).toBe(true);
  });
  test("歷史悠久的也是錯的", () => {
    expect(isDate("1988-10-21")).toBe(false);
  });
  test("非標準格式的返回false", () => {
    expect(isDate("1970-13-51")).toBe(false);
  });
  test("非標準的日期也是false", () => {
    expect(isDate("s2018ww-13-51")).toBe(false);
  });
  test("普通字符串會返回fasle", () => {
    expect(isDate("safdaserw")).toBe(false);
  });
});


目录
相关文章
|
3月前
|
测试技术 UED 开发者
性能测试报告-用于项目的性能验证、性能调优、发现性能缺陷等应用场景
性能测试报告用于评估系统性能、稳定性和安全性,涵盖测试环境、方法、指标分析及缺陷优化建议,是保障软件质量与用户体验的关键文档。
|
4月前
|
机器学习/深度学习 存储 分布式计算
Java 大视界 --Java 大数据机器学习模型在金融风险压力测试中的应用与验证(211)
本文探讨了Java大数据与机器学习模型在金融风险压力测试中的创新应用。通过多源数据采集、模型构建与优化,结合随机森林、LSTM等算法,实现信用风险动态评估、市场极端场景模拟与操作风险预警。案例分析展示了花旗银行与蚂蚁集团的智能风控实践,验证了技术在提升风险识别效率与降低金融风险损失方面的显著成效。
|
6月前
|
机器学习/深度学习 JavaScript 前端开发
JS进阶教程:递归函数原理与篇例解析
通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
268 19
|
10月前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
8月前
|
JavaScript
JS实现多条件搜索函数
JS封装的多条件搜索
|
8月前
|
存储 JavaScript
|
10月前
|
JavaScript 前端开发
JavaWeb JavaScript ③ JS的流程控制和函数
通过本文的详细介绍,您可以深入理解JavaScript的流程控制和函数的使用,进而编写出高效、可维护的代码。
213 32
|
9月前
|
Oracle 关系型数据库 MySQL
使用崖山YMP 迁移 Oracle/MySQL 至YashanDB 23.2 验证测试
这篇文章是作者尚雷关于使用崖山YMP迁移Oracle/MySQL至YashanDB 23.2的验证测试分享。介绍了YMP的产品信息,包括架构、版本支持等,还详细阐述了外置库部署、YMP部署、访问YMP、数据源管理、任务管理(创建任务、迁移配置、离线迁移、校验初始化、一致性校验)及MySQL迁移的全过程。
|
9月前
|
JavaScript 前端开发 Java
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
柯里化是一种强大的函数式编程技术,它通过将函数分解为单参数形式,实现了灵活性与可复用性的统一。无论是参数复用、延迟执行,还是函数组合,柯里化都为现代编程提供了极大的便利。 从 Redux 的选择器优化到复杂的数据流处理,再到深度嵌套的函数优化,柯里化在实际开发中展现出了非凡的价值。如果你希望编写更简洁、更优雅的代码,柯里化无疑是一个值得深入学习和实践的工具。从简单的实现到复杂的应用,希望这篇博客能为你揭开柯里化的奥秘,助力你的开发之旅! 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
|
12月前
|
算法 数据挖掘 测试技术
犬类癌症检测(CANDiD)研究:使用独立测试集对1000多只犬进行基于高通量测序的多癌种早期检测"液体活检"血液测试的临床验证
这项研究首次在大规模独立测试集上验证了基于NGS的液体活检在犬类多癌种检测中的应用。该方法具有很高的特异性,可以作为一种新的无创癌症筛查和辅助诊断工具。通过早期发现癌症,有望改善犬类癌症的诊断和管理模式。
220 12