<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
export const runCallback = callBack => { return callBack(); };
我們對上面的程式碼進行測試:
import { runCallback } from "./demo"; test("測試 runCallback", () => { const fn = jest.fn(); // mock函數,捕獲函數的呼叫 runCallback(fn); expect(fn).toBeCalled(); // expect(runCallback(() => "hello")).toBe("hello"); });
通過 jest.fn
生成的 mock 函數,我們可以列印其 fn.mock
,得到以下結果:
calls
被呼叫的情況,通過 fn.mock.calls.length
可獲取 mock 函數被呼叫次數,每個陣列裡存放傳遞給 mock 函數的引數instances
jest.fn
生成函數的 this 指向invocationCallOrder
傳遞進去函數的執行順序results
函數輸出的結果// mock函數返回123,results的value變為123 const fn = jest.fn(() => 123); // 等價於 fn.mockReturnValue("123"); // 等價於 fn.mockImplementation(() => 123); // 模擬返回一次函數結果 fn.mockReturnValueOnce("123"); // 等價於 fn.mockImplementationOnce(() => 123);
測試非同步程式碼每次都傳送真實請求,無疑是很慢的,我們可以使用 mock 模擬請求方法
// demo.js import axios from "axios"; export function getData() { return axios.get("http://www.dell-lee.com/react/api/demo.json"); }
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");
當我們有如下程式碼需要測試的時候:
export default callback => { setTimeout(() => { callback(); }, 3000); };
測試:
import timer from "./timer"; test("測試 timer", done => { timer(() => { expect(1).toBe(1); done(); }); });
我們不可能總是等待定時器完才去執行用例,這時候我們要用 Jest 來操作時間!步驟如下:
import timer from "./timer"; beforeEach(() => { jest.useFakeTimers(); }); test("測試 timer", () => { // jest.fn() 生成的是一個函數,這個函數能被監聽呼叫過幾次 const fn = jest.fn(); timer(fn); jest.advanceTimersByTime(3000); expect(fn).toHaveBeenCalledTimes(1); });
在 util.js
中定義了 Util
類
export class Util { a() {} b() {} }
在 useUtil.js
呼叫這個類
import { Util } from "./util"; export function useUtil() { let u = new Util(); u.a(); u.b(); }
我們需要測試 u.a
和 u.b
被呼叫
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 的實體方法被執行了", () => { useUtil(); expect(Util).toHaveBeenCalled(); expect(Util.mock.instances[0].a).toHaveBeenCalled(); expect(Util.mock.instances[0].b).toHaveBeenCalled(); });
config.js
export const generateConfig = () => { return { server: "https://localhost", port: 8080, domain: "localhost" }; };
測試用例部分:
import { generateConfig } from "./config"; test("測試 generateConfig", () => { // 儲存會生成 __snapshots__ 目錄,記住設定相關內容 expect(generateConfig()).toMatchSnapshot(); });
改變 config 檔案內容,測試不通過,按 u
可以更新快照
如果有兩個快照改變,我們需要一個個更新,我們可以按 i
進入以下介面:
按 s
先跳過此次測試用例
按 u
可一個個更新快照內容,使得測試通過
如果我們設定有不斷變化的量:
time: new Date()
我們可以這樣測試,保證 time 是一個 Date
型別即可
test("測試 generateConfig", () => { expect(generateConfig()).toMatchSnapshot({ time: expect.any(Date) }); });
我們除了可以成目錄儲存快照內容,還可以生成行內快照,存放本檔案即可
test("測試 generateConfig", () => { // 需要安裝prettier expect(generateConfig()).toMatchInlineSnapshot(); });
jsDom api
,所以我們能使用 jest 測試 domdom.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 進階教學範例的詳細內容,更多關於Jest 前端自動化測試的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45