【前端單元測(cè)試入門05】react的單元測(cè)試之jest

jest

jest是facebook推出的一款測(cè)試框架喝噪,集成了前面所講的Mocha和chai捣域,jsdom故觅,sinon等功能燥撞。

安裝與配置

npm install --save-dev jest
npm install -g jest

運(yùn)行命令jest后會(huì)自動(dòng)運(yùn)行項(xiàng)目下所有.test.js和.spec.js這種格式的文件座柱。

涉及到運(yùn)用ES或react的迷帜,要與babel相結(jié)合,加上.babelrc文件即可色洞,老玩法了戏锹。

jest的配置默認(rèn)只需要在package.json中配置即可,當(dāng)然也可以用獨(dú)立的配置文件火诸。

我們這里直接將jest的運(yùn)行范圍限定在test文件夾下锦针,而不是全部,所以在package.json中加入如下配置:

 "jest": {
    "testRegex": "/test/.*.test.jsx?$"
 }

注意到這里的匹配規(guī)則是正則表達(dá)式

基本用法

和之前介紹的mocha和chai的功能很像置蜀,甚至可以兼容部分mocha和chai的語法奈搜。

可以這么寫

import React from 'react'
import { shallow } from 'enzyme'
import CommentItem from './commentItem'

describe('測(cè)試評(píng)論列表項(xiàng)組件', () => {
  // 這是mocha的玩法,jest可以直接兼容
  it('測(cè)試評(píng)論內(nèi)容小于等于200時(shí)不出現(xiàn)展開收起按鈕', () => {
    const propsData = {
      date: '2018-03-04 10:10:11',
      name: '匿名人',
      content: '測(cè)試標(biāo)題測(cè)試標(biāo)題測(cè)試標(biāo)題測(cè)試標(biāo)題測(cè)試標(biāo)題測(cè)試標(biāo)題測(cè)試標(biāo)題測(cè)試標(biāo)題測(cè)試標(biāo)題測(cè)試標(biāo)題測(cè)試標(biāo)題測(cè)試標(biāo)題'
    }
    const item = shallow(<CommentItem {...propsData} />)
    //看到這里的斷言了嗎盯荤,實(shí)際上和chai的expect是很像的
    expect(item.find('.btn-expand').length).toBe(0);
  })
  // 這是jest的玩法馋吗,推薦用這種
  test('兩數(shù)相加結(jié)果為兩個(gè)數(shù)字的和', () => {
    expect(3).toBe(3);
  });
}

jest與eslint檢測(cè)

如果看了上面的代碼會(huì)發(fā)現(xiàn)我沒有引用任何類似于

import *  from 'jest'

的代碼,而那個(gè)expect是沒有定義的廷雅。
這段代碼直接運(yùn)行jest命令沒有任何問題耗美,但是eslint會(huì)檢測(cè)出錯(cuò),對(duì)于這種情況航缀,我們可以再eslint配置文件.eslintrc中加入以下代碼:

"env": {
    "jest": true
  },

jest的斷言

前面的章節(jié)介紹的斷言庫chai商架,jest有自己的斷言玩法。
除了前面的代碼中已經(jīng)寫到的

expect(x).toBe(y)//判斷相等芥玉,使用Object.is實(shí)現(xiàn)

還有常用的

expect({a:1}).toBe({a:1})//判斷兩個(gè)對(duì)象是否相等
expect(1).not.toBe(2)//判斷不等

expect(n).toBeNull();//判斷是否為null
expect(n).toBeUndefined();//判斷是否為undefined
expect(n).toBeDefined();//判斷結(jié)果與toBeUndefined相反
expect(n).toBeTruthy();//判斷結(jié)果為true
expect(n).toBeFalsy();//判斷結(jié)果為false

expect(value).toBeGreaterThan(3);//大于3
expect(value).toBeGreaterThanOrEqual(3.5);//大于等于3.5
expect(value).toBeLessThan(5);//小于5
expect(value).toBeLessThanOrEqual(4.5);//小于等于4.5

expect(value).toBeCloseTo(0.3); // 浮點(diǎn)數(shù)判斷相等

expect('Christoph').toMatch(/stop/);//正則表達(dá)式判斷

expect(['one','two']).toContain('one');//不解釋


function compileAndroidCode() {
  throw new ConfigError('you are using the wrong JDK');
}

test('compiling android goes as expected', () => {
  expect(compileAndroidCode).toThrow();
  expect(compileAndroidCode).toThrow(ConfigError);//判斷拋出異常
})

更多斷言玩法

jest的mock

介紹了jest替代mocha和chai的部分蛇摸,那么接下來就看看如何替代sinon。
下面是官網(wǎng)的示例:

function forEach(items, callback) {
  for (let index = 0; index < items.length; index++) {
   callback(items[index]);
  }
}

const mockCallback = jest.fn();
forEach([0, 1], mockCallback);

// 判斷是否被執(zhí)行兩次
expect(mockCallback.mock.calls.length).toBe(2);

// 判斷函數(shù)被首次執(zhí)行的第一個(gè)形參為0
expect(mockCallback.mock.calls[0][0]).toBe(0);

// 判斷函數(shù)第二次被執(zhí)行的第一個(gè)形參為1
expect(mockCallback.mock.calls[1][0]).toBe(1);

從上面可以看到這種玩法很類似于sinon的 sinon.spy()灿巧。
當(dāng)然也有類似于stub返回值的那種玩法赶袄,更多的請(qǐng)參考 jest mock的更多玩法

mock文件和css module的問題

如果js文件中引用了css或者本地其他文件,那么就可能測(cè)試失敗抠藕。
為了解決這個(gè)問題饿肺,同時(shí)也為了提高測(cè)試效率,:

"jest": {
    "moduleNameMapper": {
     "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/test/config/fileMock.js",
     "\\.(css|less)$": "identity-obj-proxy"
 }

而fileMock.js文件內(nèi)容為:

module.exports = 'test-file-stub';

然后安裝identity-obj-proxy即可:

npm install --save-dev identity-obj-proxy

生成測(cè)試覆蓋率報(bào)告

只需要在jest命令后加入 --coverage即可

jest --coverage
單元測(cè)試覆蓋率報(bào)告
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末盾似,一起剝皮案震驚了整個(gè)濱河市敬辣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌零院,老刑警劉巖溉跃,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異告抄,居然都是意外死亡撰茎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門打洼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來龄糊,“玉大人逆粹,你說我怎么就攤上這事∫锴” “怎么了枯饿?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)诡必。 經(jīng)常有香客問我奢方,道長(zhǎng),這世上最難降的妖魔是什么爸舒? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任蟋字,我火速辦了婚禮,結(jié)果婚禮上扭勉,老公的妹妹穿的比我還像新娘鹊奖。我一直安慰自己,他們只是感情好涂炎,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布忠聚。 她就那樣靜靜地躺著,像睡著了一般唱捣。 火紅的嫁衣襯著肌膚如雪两蟀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天震缭,我揣著相機(jī)與錄音赂毯,去河邊找鬼。 笑死拣宰,一個(gè)胖子當(dāng)著我的面吹牛党涕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播巡社,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼膛堤,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了晌该?” 一聲冷哼從身側(cè)響起肥荔,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎气笙,沒想到半個(gè)月后次企,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怯晕,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡潜圃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舟茶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谭期。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡堵第,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出隧出,到底是詐尸還是另有隱情踏志,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布胀瞪,位于F島的核電站针余,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏凄诞。R本人自食惡果不足惜圆雁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帆谍。 院中可真熱鬧伪朽,春花似錦、人聲如沸汛蝙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窖剑。三九已至坚洽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苛吱,已是汗流浹背酪术。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翠储,地道東北人绘雁。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像援所,于是被迫代替她去往敵國和親庐舟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344