搜尋
首頁web前端js教程Jest是什麼? Jest的基本使用方法

Jest是什麼? Jest的基本使用方法

Oct 18, 2018 pm 02:51 PM
javascriptnode.jsreact.jsvue.js

這篇文章帶給大家的內容是關於Jest是什麼? Jest相關知識的介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

1 什麼是Jest?

Jest

Jest是Facebook 的一套開源的JavaScript 測試框架, 它自動整合了斷言、JSDom、覆蓋率報告等開發者所需的所有測試工具,是一款幾乎零配置的測試框架。而且它對同樣是 Facebook 的開源前端框架 React 的測試十分友善。

2 安裝Jest

2.1 初始化package.json

在shell中輸入以下指令,初始化前端專案並產生package.json:

npm init -y

2.2 安裝Jest及相關依賴

在shell中輸入以下指令,安裝測試所需的依賴:

npm install -D jest babel-jest babel-core babel-preset-env regenerator-runtime

babel-jest、 babel-core、 regenerator-runtime、 babel-preset-env這幾個依賴是為了讓我們可以使用ES6的語法特性進行單元測試,ES6提供的import 來導入模組的方式,Jest本身是不支援的。

2.3 新增.babelrc檔案

在專案的根目錄下新增.babelrc文件,並在檔案複製如下內容:

{ 
 "presets": ["env"]
}

2.4 修改package.json中的test腳本

開啟package.json文件,將script下的test的值修改為jest:

"scripts": {
  "test": "jest"
  }

3. 寫你的第一個Jest測試

#建立src和test目錄及相關檔案

在專案根目錄下建立src目錄,並在src目錄下加入functions.js檔案

在專案根目錄下建立test目錄,並在test目錄下建立functions.test.js檔案

Jest會自動找到專案中所有使用.spec.js或.test.js檔案命名的測試檔案並執行,通常我們在編寫測試文件時遵循的命名規格:測試檔案的檔案名稱= 被測試模組名稱.test.js,例如被測試模組為functions.js,那麼對應的測試檔案命名為functions.test.js。

在src/functions.js中建立被測試的模組

export default {
  sum(a, b) {
      return a + b;
  }
}

在test/functions.test.js檔案中建立測試案例

import functions  from '../src/functions';
test('sum(2 + 2) 等于 4', () => {
  expect(functions.sum(2, 2)).toBe(4);
})

運行npm run test, Jest會在shell中印出以下訊息:

PASS  test/functions.test.js
  √ sum(2 + 2) 等于 4 (7ms)
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        4.8s

4.常用的幾個Jest斷言

上面測試案例中的expect(functions.sum(2, 2)).toBe(4)為一句斷言,Jest為我們提供了expect函數用來包裝被測試的方法並返回一個對象,該對像中包含一系列的匹配器來讓我們更方便的進行斷言,上面的toBe函數即為一個匹配器。我們來介紹幾種常用的Jest斷言,其中會涉及多個匹配器。

.not

//functions.test.js
import functions  from '../src/functions'
test('sum(2, 2) 不等于 5', () => {
  expect(functions.sum(2, 2)).not.toBe(5);
})

.not修飾符允許你測試結果不等於某個值的情況,這和英文的語法幾乎完全一樣,很好理解。

.toEqual()

// functions.js
export default {
  getAuthor() {
      return {
            name: 'LITANGHUI',      
            age: 24,
    }
  }
}
// functions.test.js
import functions  from '../src/functions';
test('getAuthor()返回的对象深度相等', () => {
  expect(functions.getAuthor()).toEqual(functions.getAuthor());
})
test('getAuthor()返回的对象内存地址不同', () => {
  expect(functions.getAuthor()).not.toBe(functions.getAuthor());
})

.toEqual匹配器會遞歸的檢查物件所有屬性和屬性值是否相等,所以如果要進行應用類型的比較時,請使用.toEqual匹配器而不是.toBe。

.toHaveLength

// functions.js
export default {
  getIntArray(num) {
      if (!Number.isInteger(num)) {
            throw Error('"getIntArray"只接受整数类型的参数');
    }
        let result = [];    
        for (let i = 0, len = num; i < len; i++) {
      result.push(i);
    }    
    return result;
  }
}
// functions.test.js
import functions  from &#39;../src/functions&#39;;
test(&#39;getIntArray(3)返回的数组长度应该为3&#39;, () => {
  expect(functions.getIntArray(3)).toHaveLength(3);
})

.toHaveLength可以很方便的用來測試字串和陣列類型的長度是否滿足預期。

.toThrow

// functions.test.js
import functions  from &#39;../src/functions&#39;;
test(&#39;getIntArray(3.3)应该抛出错误&#39;, () => {
  function getIntArrayWrapFn() {
    functions.getIntArray(3.3);
  }
  expect(getIntArrayWrapFn).toThrow(&#39;"getIntArray"只接受整数类型的参数&#39;);
})

.toThorw可能夠讓我們測試被測試方法是否按照預期拋出異常,但是在使用時需要注意的是:我們必須使用一個函數將被測試的函數做一個包裝,正如上面getIntArrayWrapFn所做的那樣,否則會因為函數拋出導致該斷言失敗。

.toMatch

// functions.test.js
import functions  from &#39;../src/functions&#39;;
test(&#39;getAuthor().name应该包含"li"这个姓氏&#39;, () => {
  expect(functions.getAuthor().name).toMatch(/li/i);
})

.toMatch傳入一個正規表示式,它允許我們用來進行字串類型的正規匹配。

5 測試非同步函數

安裝axios
這裡我們使用最常用的http請求庫axios來進行請求處理

npm install axios

編寫http請求函數
我們將請求http://jsonplaceholder.typicode.com/users/1,這是由JSONPlaceholder提供的mock請求位址

Jest是什麼? Jest的基本使用方法


#JSONPlaceholder

// functions.js
import axios from &#39;axios&#39;;
export default {
  fetchUser() {
      return axios.get(&#39;http://jsonplaceholder.typicode.com/users/1&#39;)
      .then(res => res.data)
      .catch(error => console.log(error));
  }
}
// functions.test.js
import functions  from &#39;../src/functions&#39;;
test(&#39;fetchUser() 可以请求到一个含有name属性值为Leanne Graham的对象&#39;, () => {
  expect.assertions(1);  
  return functions.fetchUser()
    .then(data => {
      expect(data.name).toBe(&#39;Leanne Graham&#39;);
    });
})

上面我們呼叫了expect.assertions(1),它能確保在非同步的測試案例中,有一個斷言會在回呼函數中被執行。這在進行非同步程式碼的測試中十分有效。

使用async和await精簡非同步程式碼

test(&#39;fetchUser() 可以请求到一个用户名字为Leanne Graham&#39;, async () => {
  expect.assertions(1);
    const data =  await functions.fetchUser();
  expect(data.name).toBe(&#39;Leanne Graham&#39;)
})

當然我們既然安裝了Babel,為何不使用async和await的語法來精簡我們的非同步測試程式碼呢? 但別忘記都需要調用expect.assertions方法。

以上是Jest是什麼? Jest的基本使用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:简书。如有侵權,請聯絡admin@php.cn刪除
Python vs. JavaScript:學習曲線和易用性Python vs. JavaScript:學習曲線和易用性Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Python vs. JavaScript:社區,圖書館和資源Python vs. JavaScript:社區,圖書館和資源Apr 15, 2025 am 12:16 AM

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C到JavaScript:所有工作方式從C/C到JavaScript:所有工作方式Apr 14, 2025 am 12:05 AM

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript引擎:比較實施JavaScript引擎:比較實施Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

超越瀏覽器:現實世界中的JavaScript超越瀏覽器:現實世界中的JavaScriptApr 12, 2025 am 12:06 AM

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

使用Next.js(後端集成)構建多租戶SaaS應用程序使用Next.js(後端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:23 AM

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

如何使用Next.js(前端集成)構建多租戶SaaS應用程序如何使用Next.js(前端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:22 AM

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript:探索網絡語言的多功能性JavaScript:探索網絡語言的多功能性Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具