亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

前端自動化測試之Jest?進階教程示例

 更新時間:2023年02月14日 10:38:56   作者:云牧  
這篇文章主要為大家介紹了前端自動化測試之Jest?進階教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

Jest Mock

mock 異步方法

export const runCallback = callBack => {
  return callBack();
};

我們對上面的代碼進行測試:

import { runCallback } from "./demo";
test("測試 runCallback", () => {
  const fn = jest.fn(); // mock函數(shù),捕獲函數(shù)的調(diào)用
  runCallback(fn);
  expect(fn).toBeCalled();
  // expect(runCallback(() => "hello")).toBe("hello");
});

通過 jest.fn 生成的 mock 函數(shù),我們可以打印其 fn.mock,得到以下結(jié)果:

  • calls 被調(diào)用的情況,通過 fn.mock.calls.length 可獲取 mock 函數(shù)被調(diào)用次數(shù),每個數(shù)組里存放傳遞給 mock 函數(shù)的參數(shù)
  • instances jest.fn 生成函數(shù)的 this 指向
  • invocationCallOrder 傳遞進去函數(shù)的執(zhí)行順序
  • results 函數(shù)輸出的結(jié)果
// mock函數(shù)返回123,results的value變?yōu)?23
const fn = jest.fn(() => 123); 
// 等價于
fn.mockReturnValue("123");
// 等價于
fn.mockImplementation(() => 123);
// 模擬返回一次函數(shù)結(jié)果
fn.mockReturnValueOnce("123");
// 等價于
fn.mockImplementationOnce(() => 123);

測試異步代碼每次都發(fā)送真實請求,無疑是很慢的,我們可以使用 mock 模擬請求方法

  • 導出我們的請求方法
// demo.js
import axios from "axios";
export function getData() {
  return axios.get("http://www.dell-lee.com/react/api/demo.json");
}
  • 同級目錄下建一個 **mocks** 的文件夾,建立同名的文件,此文件就是模擬請求的文件

export function fetchData() {
  return Promise.resolve({
    success: true
  });
}
  • 測試用例部分:
// 模擬 request 模塊
jest.mock("./request.js"); // 也可以在 jest.config.js 里面手動設置 automock 為 true
// 取消 mock
// jest.unmock("./demo.js");
import { fetchData } from "./request";
test("測試 fetchData", () => {
  // 此請求實際會請求 __mocks__ 下的 request.js 方法
  return fetchData().then(data => {
    expect(data).toEqual({
      success: true
    });
  });
});

如果我們 request.js 某些方法不需要 mock

const { getNumber } = jest.requireActual("./request.js");

Mock Timers

當我們有如下代碼需要測試的時候:

export default callback => {
  setTimeout(() => {
    callback();
  }, 3000);
};

測試:

import timer from "./timer";
test("測試 timer", done => {
  timer(() => {
    expect(1).toBe(1);
    done();
  });
});

我們不可能總是等待定時器完才去執(zhí)行用例,這時候我們要用 Jest 來操作時間!步驟如下:

  • 通過 jest.useFakeTimers() 使用 jest "自制的" 定時器
  • 執(zhí)行 timer 函數(shù)之后,快進時間 3 秒 jest.advanceTimersByTime(3000),這個方法可以調(diào)用任意次,快進的時間會疊加
  • 這時候我們已經(jīng)穿梭到了 3 秒后,expect 也能生效了!
import timer from "./timer";
beforeEach(() => {
  jest.useFakeTimers();
});
test("測試 timer", () => {
  // jest.fn() 生成的是一個函數(shù),這個函數(shù)能被監(jiān)聽調(diào)用過幾次
  const fn = jest.fn();
  timer(fn);
  jest.advanceTimersByTime(3000);
  expect(fn).toHaveBeenCalledTimes(1);
});

Mock 類

  • 當我們只關注類的方法是否被調(diào)用,而不關心方法調(diào)用產(chǎn)生的結(jié)果時,可以 mock 類

util.js 中定義了 Util

export class Util {
  a() {}
  b() {}
}

useUtil.js 調(diào)用這個類

import { Util } from "./util";
export function useUtil() {
  let u = new Util();
  u.a();
  u.b();
}

我們需要測試 u.au.b 被調(diào)用

jest.mock("util.js") 會將 Util、Util.a、Util.b 都 mock 成 jest.fn

jest.mock("util.js"); // mock Util 類
import { Util } from "./util/util";
import { useUtil } from "./util/uesUtil";
test("util 的實例方法被執(zhí)行了", () => {
  useUtil();
  expect(Util).toHaveBeenCalled();
  expect(Util.mock.instances[0].a).toHaveBeenCalled();
  expect(Util.mock.instances[0].b).toHaveBeenCalled();
});

Snapshot 快照測試

  • 將文件內(nèi)容拍照一樣拍下來。下次運行測試用例的時候,如果內(nèi)容變化,則會報錯

config.js

export const generateConfig = () => {
  return {
    server: "https://localhost",
    port: 8080,
    domain: "localhost"
  };
};

測試用例部分:

import { generateConfig } from "./config";
test("測試 generateConfig", () => {
  // 保存會生成 __snapshots__ 目錄,記住配置相關內(nèi)容
  expect(generateConfig()).toMatchSnapshot();
});

改變 config 文件內(nèi)容,測試不通過,按 u 可以更新快照

如果有兩個快照改變,我們需要一個個更新,我們可以按 i進入以下界面:

s 先跳過此次測試用例

u 可一個個更新快照內(nèi)容,使得測試通過

如果我們配置有不斷變化的量:

time: new Date()

我們可以這樣測試,保證 time 是一個 Date 類型即可

test("測試 generateConfig", () => {
  expect(generateConfig()).toMatchSnapshot({
    time: expect.any(Date)
  });
});

我們除了可以成目錄保存快照內(nèi)容,還可以生成行內(nèi)快照,存放本文件即可

test("測試 generateConfig", () => {
  // 需要安裝prettier
  expect(generateConfig()).toMatchInlineSnapshot();
});

DOM 測試

  • jest 自己模擬了一套 jsDom api ,所以我們能使用 jest 測試 dom

dom.js

export function addDivToBody() {
  const div = document.createElement("div");
  document.body.appendChild(div);
}

測試:

import { addDivToBody } from "./timer";
test("測試 addDivToBody", () => {
  addDivToBody();
  addDivToBody();
  expect(document.body.querySelectorAll("div").length).toBe(2);
});

以上就是前端自動化測試之Jest 進階教程示例的詳細內(nèi)容,更多關于Jest 前端自動化測試的資料請關注腳本之家其它相關文章!

相關文章

  • JavaScript?Promise實現(xiàn)異步并發(fā)任務控制器

    JavaScript?Promise實現(xiàn)異步并發(fā)任務控制器

    這篇文章主要為大家介紹了JavaScript?Promise實現(xiàn)異步并發(fā)任務控制器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • 前端面試必會網(wǎng)絡跨域問題解決方法

    前端面試必會網(wǎng)絡跨域問題解決方法

    這篇文章主要為大家介紹了前端面試必會的網(wǎng)絡跨域問題解決方法講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • JS前端設計模式之發(fā)布訂閱模式詳解

    JS前端設計模式之發(fā)布訂閱模式詳解

    這篇文章主要為大家介紹了JS前端設計模式之發(fā)布訂閱模式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 微信小程序 chooseImage選擇圖片或者拍照

    微信小程序 chooseImage選擇圖片或者拍照

    這篇文章主要介紹了微信小程序 chooseImage選擇圖片或者拍照的相關資料,需要的朋友可以參考下
    2017-04-04
  • ECharts transform數(shù)據(jù)轉(zhuǎn)換和dataZoom在項目中使用

    ECharts transform數(shù)據(jù)轉(zhuǎn)換和dataZoom在項目中使用

    這篇文章主要為大家介紹了ECharts transform數(shù)據(jù)轉(zhuǎn)換和dataZoom在項目中使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 詳解requestAnimationFrame和setInterval該如何選擇

    詳解requestAnimationFrame和setInterval該如何選擇

    這篇文章主要為大家介紹了requestAnimationFrame和setInterval該如何選擇示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>
    2023-03-03
  • 特殊字符、常規(guī)符號及其代碼對照表

    特殊字符、常規(guī)符號及其代碼對照表

    特殊字符、常規(guī)符號及其代碼對照表...
    2006-06-06
  • 微信小程序 navbar實例詳解

    微信小程序 navbar實例詳解

    這篇文章主要介紹了微信小程序 navbar實例詳解的相關資料,需要的朋友可以參考下
    2017-05-05
  • js 數(shù)組 fill() 填充方法

    js 數(shù)組 fill() 填充方法

    這篇文章主要介紹了js 數(shù)組 fill() 的填充方法,初始化數(shù)組的方法,但是初始化數(shù)組之后,數(shù)組中的每一項元素默認為 empty 空位占位,如何對數(shù)組這些空位添加默認的元素,ES6提供了 fill() 方法實現(xiàn)這一操作。本文總結(jié)數(shù)組 fill() 方法的詳細使用,需要的朋友可以參考一下
    2021-10-10
  • js作用域及作用域鏈工作引擎

    js作用域及作用域鏈工作引擎

    這篇文章主要為大家介紹了js作用域及作用域鏈工作引擎,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07

最新評論