前端自動化測試之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.a
和 u.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ā)任務控制器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06ECharts transform數(shù)據(jù)轉(zhuǎn)換和dataZoom在項目中使用
這篇文章主要為大家介紹了ECharts transform數(shù)據(jù)轉(zhuǎn)換和dataZoom在項目中使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12詳解requestAnimationFrame和setInterval該如何選擇
這篇文章主要為大家介紹了requestAnimationFrame和setInterval該如何選擇示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>2023-03-03