JS不靠譜系列: 寫一個驗證過時時間的函數,包含jest單元測試

前言

咱們常常用到的token仍是cookie,都默認有一個過時時間javascript

咱們作鑑權的時候,很依賴這個,因此搗鼓下能不能再嚴謹點java

由於以前都是之後臺固定的格式,直接拿到值作一個簡單的判斷;git

那,假如後臺傳過來的日期格式變了呢!!有興趣的瞧瞧。github

前置基礎

  • jest : 這個測試框架很是不錯,Facebook 出品
  • ES5&&ES6
  • Typescript

咱們不講配置,也不講其餘瑣碎,只說實現過程typescript

思路分析

重心其實就是圍繞傳參來執行cookie

  • 判斷參數的類型,只考慮兩種狀況
  • 數字: 驗證是否爲一個正確的時間戳!!!!
  • 字符串: 驗證是不是一個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);
  });
});

複製代碼

總結

純函數測試只要聲明推斷返回值便可, 因此單元測試也很是的直白明瞭..

純函數的好處就是能夠低耦合,雖然咱們能夠在這裏高內聚,好比作續期,請求,路由跳轉什麼的,

那這樣就是一個auth的全部功能了,這不是我想要的,

有不對之處請留言,會及時修正,謝謝閱讀

相關文章
相關標籤/搜索