Jest

1. 介紹

Jest是 Facebook 的一套開源的 JavaScript 測試框架聋迎, 它自動集成了斷言姐帚、JSDom衷旅、覆蓋率報告等開發(fā)者所需要的所有測試工具器一,是一款幾乎零配置的測試框架课锌。

2. 安裝
  • 通過 npm 添加依賴:
 npm install --save-dev jest babel-jest babel-core babel-preset-env  
 regenerator-runtime

babel-jest、 babel-core祈秕、 regenerator-runtime渺贤、babel-preset-env這幾個依賴是為了讓我們可以使用ES6的語法特性進(jìn)行單元測試,ES6提供的 import 來導(dǎo)入模塊的方式请毛,Jest本身是不支持的志鞍。

  • 添加.babelrc文件
    在項(xiàng)目的根目錄下添加.babelrc文件,并在文件復(fù)制如下內(nèi)容:
  {
    "presets": ["env"]
  }
  • 修改package.json中的test腳本
    打開package.json文件方仿,將script下的test的值修改為jest:
    "scripts": {
      "test": "jest"
    }
3. 使用
  • sum.js
   import axios from 'axios';

   function sum (a, b) {
       return a+b;
   }
   function add (a, b) {
     return a+b;
   }
   function fetchUser() {
     return axios.get('http://jsonplaceholder.typicode.com/users/1')
       .then(res => res.data)
       .catch(error => console.log(error));
   }
   export {
     sum,
     fetchUser
   }
  • sun.test.js
  import {sum , fetchUser}  from './sum';
  // const fetchUser = require('./sum')

  // 1. 相等判斷:toBe 使用 Object.is 來判斷相等固棚,
  // toEqual 會遞歸判斷 Object 的每一個字段统翩,
  // 對數(shù)值來說 toBe 和 toEqual 相同;
  test("兩個數(shù)字相加", () => {
    expect(sum(1,2)).not.toBe(2);
  })

test('object assignment', () => {
  const data = {one: 1};
  data['two'] = 2;
  expect(data).toEqual({one: 1, two: 2});
});

// 2. 判斷符點(diǎn)數(shù):可使用 toBeCloseTo 來解決 JS 浮點(diǎn)精度帶來的問題此洲,如下示例厂汗;
test('adding floating point numbers', () => {
  const value = 0.1 + 0.2; // 0.30000000000000004
  expect(value).toBeCloseTo(0.3); // 測試通過
});

test('fetchUser() 可以請求到一個含有name屬性值為Leanne Graham的對象', () => {
  expect.assertions(1);
  return fetchUser()
    .then(data => {
      expect(data.name).toBe('Leanne Graham');
    });
});
//上面調(diào)用了expect.assertions(1),它能確保在異步的測試用例中呜师,
//有一個斷言會在回調(diào)函數(shù)中被執(zhí)行面徽。這在進(jìn)行異步代碼的測試中十分有效。

test('mock', () => {
  const mockCallback = jest.fn(x => 42 + x);
  [0, 1].forEach(mockCallback);
  console.log(mockCallback.mock.calls,'mockCallback.mock.calls')
  // Mock函數(shù)被調(diào)用兩次
  expect(mockCallback.mock.calls.length).toBe(2);
  // 第一次調(diào)用Mock函數(shù)時匣掸,第一個參數(shù)為0
  expect(mockCallback.mock.calls[0][0]).toBe(0);
  // 第二次調(diào)用Mock函數(shù)時趟紊,第一個參數(shù)為1
  expect(mockCallback.mock.calls[1][0]).toBe(1);
  // 第一次調(diào)用Mock函數(shù)的返回值為42
  expect(mockCallback.mock.results[0].value).toBe(42);

  // const myMock = jest.fn();
  // const a = new myMock();
  // const b = {};
  // const bound = myMock.bind(b);
  // bound();
  // console.log(myMock.mock.instances);
  // // > [ <a>, <b> ]

  // Mock 函數(shù)還可以通過工具函數(shù)模擬返回值。
  const myMock = jest.fn();
  console.log(myMock());
  // > undefined
  myMock
  .mockReturnValueOnce(10)
  .mockReturnValueOnce('x')
  .mockReturnValue(true);
  console.log(myMock(), myMock(), myMock(), myMock());
  // > 10, 'x', true, true
  });
4. 常用斷點(diǎn)
  expect({a:1}).toBe({a:1})//判斷兩個對象是否相等
  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); //判斷拋出異常
})

了解更多斷點(diǎn)

5. 運(yùn)行測試
  • 運(yùn)行測試
    npm test
  • 使用 --watch 參數(shù)可以啟動一個監(jiān)控界面碰酝,當(dāng)文件發(fā)生變化時霎匈,會便會運(yùn)行相關(guān)的測試。
    npm test -- --watch
  • 使用 --coverage 參數(shù)送爸,測試結(jié)束時還會得到一份測試覆蓋度報告铛嘱,如下圖。
    npm test -- --coverage
    image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末袭厂,一起剝皮案震驚了整個濱河市墨吓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纹磺,老刑警劉巖帖烘,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異橄杨,居然都是意外死亡秘症,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門式矫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乡摹,“玉大人,你說我怎么就攤上這事采转〈狭” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵故慈,是天一觀的道長板熊。 經(jīng)常有香客問我,道長惯悠,這世上最難降的妖魔是什么邻邮? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮克婶,結(jié)果婚禮上筒严,老公的妹妹穿的比我還像新娘丹泉。我一直安慰自己,他們只是感情好鸭蛙,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布摹恨。 她就那樣靜靜地躺著,像睡著了一般娶视。 火紅的嫁衣襯著肌膚如雪晒哄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天肪获,我揣著相機(jī)與錄音寝凌,去河邊找鬼。 笑死孝赫,一個胖子當(dāng)著我的面吹牛较木,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播青柄,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼伐债,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了致开?” 一聲冷哼從身側(cè)響起峰锁,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎双戳,沒想到半個月后虹蒋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拣技,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年千诬,在試婚紗的時候發(fā)現(xiàn)自己被綠了耍目。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膏斤。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖邪驮,靈堂內(nèi)的尸體忽然破棺而出莫辨,到底是詐尸還是另有隱情,我是刑警寧澤毅访,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布沮榜,位于F島的核電站,受9級特大地震影響喻粹,放射性物質(zhì)發(fā)生泄漏蟆融。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一守呜、第九天 我趴在偏房一處隱蔽的房頂上張望型酥。 院中可真熱鬧山憨,春花似錦、人聲如沸弥喉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽由境。三九已至棚亩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間虏杰,已是汗流浹背讥蟆。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纺阔,地道東北人攻询。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像州弟,于是被迫代替她去往敵國和親钧栖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345