Jest前端測試入門

使用匹配器

  1. 精確匹配
    toBe匹配使用===全等匹配
test('two plus two is four', () => {
  expect(2 + 2).toBe(4);
});

如果需要檢查對象或者數(shù)組需要使用toEqual

test('object assignment', () => {
  const data = {one: 1};
  data['two'] = 2;
  expect(data).toEqual({one: 1, two: 2});
});
  1. 值匹配
  • toBeNull 只匹配 null
  • toBeUndefined 只匹配undefined
  • toBeDefined 和 toBeUndefined 相反
  • toBeTruthy 匹配任何if語句為真
  • toBeFalsy 匹配任何 if 語句為假
test('null', () => {
  const n = null;
  expect(n).toBeNull();
  expect(n).toBeDefined();
  expect(n).not.toBeUndefined();
  expect(n).not.toBeTruthy();
  expect(n).toBeFalsy();
});
  1. 數(shù)字
    大多數(shù)的比較數(shù)字有等價的匹配器
  • toBe 等于
  • toBeGreaterThan 大于
  • toBeGreaterThanOrEqual 大于等于
  • toBeLessThan 小于
  • toBeLessThanOrEqual 小于等于
  1. 字符串
    您可以檢查對具有toMatch正則表達式的字符串
test('test toMatch', () => {
  expect('dankun').toMatch(/^dan/)
});
  1. 數(shù)組和迭代器
    可以通過toContain來檢查一個數(shù)組或者迭代對象是否包含某個特定項
test('the shopping list has beer on it', () => {
  const people = ['kk','jj','nb','beer'];
  expect(people).toContain('beer')
});

具體使用參考https://jestjs.io/docs/zh-Hans/expect

測試異步代碼

  1. 回調
    測試回調需要使用done,jest會等done回調函數(shù)執(zhí)行結束后咨堤,執(zhí)行測試
const fetchData = (callback) => {
  setTimeout(() => {
    callback('dankun');
  }, 200)
}

test('測試異步回調', (done) => {
  const callback = (data) => {
    expect(data).toBe('dankun')
  }
  fetchData(callback);
});
  1. Promise
const fetchData = () => {
  return new Promise((reslove, reject) => {
    reslove('dankun')
  })
}

test('測試異步回調', () => {
  fetchData().then(data => {
    expect(data).toBe('dankun')
  });
});
  1. await
const fetchData = () => {
  return new Promise((reslove, reject) => {
    reslove('dankun')
  })
}

test('測試異步回調', async () => {
  const data = await fetchData();
  expect(data).toBe('dankun')
});

初始化和清理

寫測試的時候經(jīng)常在運行測試之前做一些準備工作,在運行測試之后進行整理工作深夯。

為多次測試重復設置

如果有一些為多次測試重復設置的工作,可以使用beforeEachafterEach

beforeEach(() => {
  console.log('start!!!')
})

afterEach(() => {
  console.log('end!!!')
})

test('test demo1', () => {
  expect('dankun').toMatch(/^dan/);
})

test('test demo2', () => {
  expect(2).toBeLessThan(3)
})

會分別執(zhí)行兩次的start和end

console.log sum.test.js:4
    start!!!

  console.log sum.test.js:8
    end!!!

  console.log sum.test.js:4
    start!!!

  console.log sum.test.js:8
    end!!!
一次性設置

某些情況下贿堰,只需要在文件的開頭做一次性的設置。需要使用beforeAll,afterAll進行處理
下面情況startend只會執(zhí)行一次

beforeAll(() => {
  console.log('start!!!')
})

afterAll(() => {
  console.log('end!!!')
})

test('test demo1', () => {
  expect('dankun').toMatch(/^dan/);
})

test('test demo2', () => {
  expect(2).toBeLessThan(3)
})
作用域

默認情況下 beforeEach和afterEach是應用到文件的每個測試囱晴。但是我們可以是describe來區(qū)分測試分組。當 before 和 after 的塊在 describe 塊內部時积暖,則其只適用于該 describe 塊內的測試风喇。

test('test demo1', () => {
  beforeEach(() => {
    console.log('demo1 start!!!')
  })
  expect('dankun').toMatch(/^dan/);
})

test('test demo2', () => {
  expect(2).toBeLessThan(3)
})

Mock函數(shù)

在項目中,一個模塊的方法內常常會去調用另外一個模塊的方法樊破。在單元測試中厅篓,我們可能并不需要關心內部調用的方法的執(zhí)行過程和結果,只想知道它是否被正確調用即可捶码,甚至會指定該函數(shù)的返回值。此時或链,使用Mock函數(shù)是十分有必要惫恼。
Mock函數(shù)提供的以下三種特性,在我們寫測試代碼時十分有用:

  • 捕獲函數(shù)調用情況
  • 設置函數(shù)返回值
  • 改變函數(shù)的內部實現(xiàn)
jest.fn()
  1. 基本使用
    jest.fn()默認會返回undefined作為返回值
let mockFn = jest.fn()
expect(mockFn()).toBeUndefined();
  1. 設置返回值
  • 返回固定值
test('測試jest.fn()返回固定值', () => {
  let mockFn = jest.fn().mockReturnValue('dankun')
  expect(mockFn()).toBe('dankun');
})
  • 內部實現(xiàn)返回某個值
test('測試jest.fn()內部實現(xiàn)', () => {
  let mockFn = jest.fn((str)=> {
    return str + 'test'
  })
  expect(mockFn('dankun_')).toBe('dankun_test');
})
  • 返回Promise
test('測試jest.fn()返回Promise', async () => {
 let mockFn = jest.fn().mockResolvedValue('default');
 let result = await mockFn();
 expect(result).toBe('default');
})
jest.mock()

比如fetch.js封裝的請求方法可能是我們在其他模塊調用時候,并不需要進行實際的請求(請求方法已經(jīng)通過單側或需要該方法返回非真實數(shù)據(jù))澳盐。此時祈纯,使用jest.mock()去mock整個模塊是十分有必要的。

// fetch函數(shù)
const axios = require('axios');

module.exports = {
  async fetchPostsList(callback) {
    return axios.get('https://jsonplaceholder.typicode.com/posts').then(res => {
      return callback(res.data);
    })
  }
}

mock的模塊

// events.js

import fetch from './fetch';

export default {
  async getPostList() {
    return fetch.fetchPostsList(data => {
      console.log('fetchPostsList be called!');
      // do something
    });
  }
}

在測試代碼中如下

// functions.test.js

import events from '../src/events';
import fetch from '../src/fetch';

jest.mock('../src/fetch.js');

test('mock 整個 fetch.js模塊', async () => {
  expect.assertions(2);
  await events.getPostList();
  expect(fetch.fetchPostsList).toHaveBeenCalled();
  expect(fetch.fetchPostsList).toHaveBeenCalledTimes(1);
});

mock.mockImplementation

當您需要定義從另一個模塊創(chuàng)建的模擬函數(shù)的默認實現(xiàn)時叼耙,mockImplementation方法很有用:
mock fetch模塊中的fetchPostsList方法

jest.mock('./fetch')
const fetch = require('./fetch');

test('fetchPostsList 函數(shù)被調用', async() => {
    fetch.fetchPostsList.mockImplementation(async () => {
        return await Promise.resolve('dankun')
    });
    const result=  await fetch.fetchPostsList();
    console.log(result)
    expect(result).toBe('dankun')
})
jest.spyOn()

jest.spyOn()方法同樣創(chuàng)建一個mock函數(shù)腕窥,但是該mock函數(shù)不僅能夠捕獲函數(shù)的調用情況,還可以正常的執(zhí)行被spy的函數(shù)筛婉。實際上簇爆,jest.spyOn()是jest.fn()的語法糖,它創(chuàng)建了一個和被spy的函數(shù)具有相同內部代碼的mock函數(shù)爽撒。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末入蛆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子硕勿,更是在濱河造成了極大的恐慌哨毁,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件源武,死亡現(xiàn)場離奇詭異扼褪,居然都是意外死亡想幻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門话浇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脏毯,“玉大人,你說我怎么就攤上這事凳枝〕冢” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵岖瑰,是天一觀的道長叛买。 經(jīng)常有香客問我,道長蹋订,這世上最難降的妖魔是什么率挣? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮露戒,結果婚禮上椒功,老公的妹妹穿的比我還像新娘。我一直安慰自己智什,他們只是感情好动漾,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荠锭,像睡著了一般旱眯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上证九,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天删豺,我揣著相機與錄音,去河邊找鬼愧怜。 笑死呀页,一個胖子當著我的面吹牛,可吹牛的內容都是我干的拥坛。 我是一名探鬼主播蓬蝶,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼猜惋!你這毒婦竟也來了疾党?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤惨奕,失蹤者是張志新(化名)和其女友劉穎雪位,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梨撞,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡雹洗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年香罐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片时肿。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡庇茫,死狀恐怖,靈堂內的尸體忽然破棺而出螃成,到底是詐尸還是另有隱情旦签,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布寸宏,位于F島的核電站宁炫,受9級特大地震影響,放射性物質發(fā)生泄漏氮凝。R本人自食惡果不足惜羔巢,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望罩阵。 院中可真熱鬧竿秆,春花似錦、人聲如沸稿壁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽傅是。三九已至搅吁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間落午,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工肚豺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留溃斋,地道東北人。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓吸申,卻偏偏與公主長得像梗劫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子截碴,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內容

  • 概要 64學時 3.5學分 章節(jié)安排 電子商務網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,223評論 0 3
  • Jest Jest 是由 Facebook 推出的一個前端測試框架梳侨,具有許多非常好的特性,譬如執(zhí)行速度快日丹、API友...
    西麥smile閱讀 4,454評論 0 5
  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,238評論 0 4
  • 1. 開啟代理,并設置為全局模式,查看自己的代理配置端口,我的為"1080" 2. 編輯“~/.gitconfig...
    了塵蘭若閱讀 734評論 0 0
  • 一些需要明確的事情 規(guī)劃:2020年走哺,跳槽。定位:MNC審計經(jīng)理哲虾, 30-40W/年丙躏。雙語工作择示。 目標: 工作: ...
    子騏閱讀 353評論 0 0