色综合老司机第九色激情 _中文字幕日韩av资源站_国产+人+亚洲_久久久精品影院_久久久视频免费观看_欧美激情亚洲自拍_亚洲成av人片在线观看香蕉_热草久综合在线_欧美极品第一页_2020国产精品自拍

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機構(gòu)

手機站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時隨地免費學(xué)

千鋒教育

掃一掃進入千鋒手機站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時隨地免費學(xué)習(xí)課程

當(dāng)前位置:首頁  >  技術(shù)干貨  > 利用Jest測試React組件

利用Jest測試React組件

來源:千鋒教育
發(fā)布人:wjy
時間: 2022-06-02 11:17:00 1654139820

## **利用Jest測試React組件**

> Jest 是一個由 facebook 維護的測試框架,在本文中,我們將利用 Jest 來測試 React 組件。我們將首先了解如何在純 JavaScript 函數(shù)上使用 Jest,然后再了解它提供的一些開箱即用的特性,這些特性旨在使測試 React 應(yīng)用程序變得更容易。

利用 Jest測試React組件

1

注意,Jest 并不是專門針對 React 的測試框架,你可以使用它來測試任何 JavaScript 應(yīng)用程序。然而,它提供的一些特性對于測試用戶界面非常方便,這就是它非常適合 React 的原因。

## **示例程序**

在可以進行測試前,我們需要一個應(yīng)用程序,在此以一個待辦事項列表為例,大家可以從 Github 中克隆該應(yīng)用:testing-react-with-jest。

示例項目利用 webpack 進行構(gòu)建,

應(yīng)用程序的入口點是 `src/index.js`,它將 `<App>` 組件呈現(xiàn)到 HTML 中:

```js
import React from 'react'
import { render } from 'react-dom'
import App from './App.jsx'

render(
  <App />,
  document.getElementById('root')
)
```

應(yīng)用程序中組件樹層級結(jié)構(gòu)如下:

2


應(yīng)用中使用到的初始狀態(tài)數(shù)據(jù)及業(yè)務(wù)邏輯在 `src/state/index.js` 中:

```js
export const initialTodos = [ ... ]

export const addTodoItem = (todos, todo) => { ... }

export const toggleTodoItem = (todos, id) => { ... }

export const removeTodoItem = (todos, id) => { ... }
```

UI 界面效果:

3

## **Jest使用**

Jest 于 2014 年首次發(fā)布,雖然它最初引起了很多人的興趣,但該項目一度處于休眠狀態(tài)。然而,F(xiàn)acebook 投入了大量精力來改進 Jest,隨后發(fā)布了一些更新的版本,與最初的開源版本相比,Jest 的唯一相似之處是名稱和徽標(biāo),其他一切都已更改和重寫。

## **安裝與配置Jest**

首先,我們需要安裝 Jest,由于我們也在使用 Babel,所以一并安裝相關(guān)的模塊,使 Jest 和 Babel 開箱即用:

```js
$ npm install jest babel-jest --save-dev
# 或
$ yarn add jest babel-jest --dev
```

在項目根目錄下創(chuàng)建 `__tests__` 目錄,Jest 希望在一個`__tests__` 目錄中找到我們的測試,這已經(jīng)成為 JavaScript 社區(qū)的流行約定,當(dāng)然,如果你對創(chuàng)建 `__tests__` 目錄統(tǒng)一管理不感冒,Jest 也支持查找任意的 `*.test.js` 或 `*.spec.js` 文件。

下面我們來測試我們的狀態(tài)函數(shù)。

繼續(xù)創(chuàng)建 `__tests__/state/index.test.js`,在正式測試之前,我們先看是否能夠正常進行測試:

```js
describe('數(shù)字加減算術(shù)運算', () => {
  test('3加2減5等于0', () => {
    expect(3 + 2 - 5).toBe(0)
  })
})
```

在 `package.json` 文件中添加 `npm scripts` 任務(wù):

```js
{
  "scripts": {
    "test": "jest"
  }
}
```

然后在命令行中執(zhí)行測試任務(wù):

```js
$ npm test
```

運行結(jié)果:

4

在 Jest 中,我們可以根據(jù)需要使用 `describe` 和 `test` 嵌套測試,`describe` 創(chuàng)建一個將幾個相關(guān)測試組合在一起的塊,`test` 是運行測試的方法。在此測試中,使用了 `expect` 和 `toBe` 來檢測兩個值是否完全相同。相關(guān) API 使用我們可以在 Jest 官方 API 文檔 中進行查閱,本文中我們也可以來了解一些 Jest 的斷言。

## **測試業(yè)務(wù)邏輯**

我們已經(jīng)通過一個示例看到了 Jest 在測試中的工作,下面我們來測試狀態(tài)邏輯中的一個函數(shù) `removeTodoItem`:

```js
export const removeTodoItem = (todos, id) => todos.filter(todo => todo.id !== id)
```

`removeTodoItem` 接收要刪除待辦事項的當(dāng)前狀態(tài)與待刪除待辦事項的 id。

利用 `describe` 與 `test` 編寫該測試:

```js
describe('待辦事項操作測試', () => {
  test('刪除待辦事項', () => {
   
  })
})
```

可能大家也會看到其它文檔中使用 `it` 來代替 `test`,其實 `it` 是作為 `test` 的別名使用的,二者是相同的作用。

下面開始編寫斷言,首先,可以創(chuàng)建一個初始狀態(tài) `todos` 數(shù)組,然后將它傳遞給 `removeTodoItem`,再傳遞我們想要刪除的新的待辦事項 id,`removeTodoItem` 會返回完成后的狀態(tài),可以如下定義:

```js
describe('待辦事項操作測試', () => {
  test('刪除待辦事項', () => {
    const todos = [
      {id: 1, title: '復(fù)習(xí) React 基礎(chǔ)知識', completed: true},
      {id: 2, title: '復(fù)習(xí) React Hooks 使用', completed: false}
    ]
    const finishedTodos = removeTodoItem(todos, 1)

    expect(finishedTodos).toEqual([{id: 2, title: '復(fù)習(xí) React Hooks 使用', completed: false}])
  })
})
```

在這里我們使用 `toEqual` 來做出斷言,它對引用類型的對象將進行“深”比較是否相等。`toBe` 一般用于原始類型的值的比較,例如字符串、數(shù)字等類型,`toEqual` 通常在數(shù)組和對象上使用。

在命令行中執(zhí)行 `npm test`:

5

可以看到測試通過。

## **測試React組件**

不建議在 React 組件上編寫太多的測試,任何你想測試的內(nèi)容,比如業(yè)務(wù)邏輯,還是建議從組件中獨立出來放在單獨的函數(shù)中,就像上邊測試狀態(tài)函數(shù)一樣。但有時測試一些 React 交互是很有必要的,如要確保用戶在單擊某個按鈕時使用正確的參數(shù)去調(diào)用特定函數(shù)。

*如果利用 Create React App 來創(chuàng)建項目,從 3.3 以后的版本中已自帶官方推薦的 testing-library,本文暫不討論 testing-library。*

## **安裝與配置Enzyme**

為了編寫我們的測試,先安裝 Enzyme,這是一個由 Airbnb 編寫的包裝庫,它使得測試 React 組件變得更容易。同時,我們還要為我們使用的 React 不同版本安裝適配器,本例中使用 React v17.x,目前還沒有官方適配器可用,但也有社區(qū)版本:

```js
$ npm install --save-dev enzyme @wojtekmaj/enzyme-adapter-react-17
# 或
$ yarn add --dev enzyme @wojtekmaj/enzyme-adapter-react-17
```

對于 React v16.x,可以使用 `enzyme-adapter-react-16`。

接著對 Enzyme 進行少量相關(guān)配置,在項目根目錄下創(chuàng)建 `setup-enzyme.js` 文件:

```js
import { configure } from 'enzyme'
import Adapter from '@wojtekmaj/enzyme-adapter-react-17'

configure({ adapter: new Adapter() })
```

然后在項目根目錄下創(chuàng)建 `jest.config.js` 文件:

```js
module.exports = {
  setupFilesAfterEnv: [
    './setup-enzyme.js'
  ],
  testEnvironment: 'jsdom'
}
```

這告訴 Jest 在執(zhí)行任何測試之前,為我們運行 `setup-tests.js` 文件,由于測試的是 Web 應(yīng)用程序,所以使用瀏覽器類似的環(huán)境 jsdom 來代替。

## **編寫組件渲染測試**

接下來我們就可以編寫測試了,我們來測試 `TodoItem` 組件是否能夠在段落中渲染待辦事項文本。

創(chuàng)建 `__tests__/components/TodoItem.test.js`:

```js
import React from 'react'
import { mount } from 'enzyme'
import TodoItem from '../../src/components/TodoItem.jsx'

describe('待辦事項-列表項組件', () => {
  test('渲染待辦事項列表項', () => {
   
  })
})
```

從 `enzyme` 中導(dǎo)入 `mount`,用于渲染組件,這樣就可以檢查輸出并對其進行斷言測試了。即使我們在 Node 環(huán)境中運行測試,也可以編寫需要的 DOM 并進行測試,因為 Jest 中允許你使用 `jsdom` 庫操作 DOM,這樣就不必每次都啟動瀏覽器來測試了。

接下來我們完成測試編寫,整個測試如下:

```js
import React from 'react'
import { mount } from 'enzyme'
import TodoItem from '../../src/components/TodoItem.jsx'

describe('待辦事項-列表項組件', () => {
  test('渲染待辦事項列表項', () => {
    const todo = {id: 2, title: '復(fù)習(xí) React Hooks 使用', completed: false}
    const wrapper = mount(
      <TodoItem todo={todo} />
    )
    const p = wrapper.find('p')
    expect(p.text()).toBe('復(fù)習(xí) React Hooks 使用')
  })
})
```

簡單說明一下,我們可以使用 `mount` 來創(chuàng)建 `TodoItem`,然后調(diào)用 `wrapper.find()` 傳遞一個 CSS 選擇器來查找節(jié)點,由于示例的 DOM 很簡單,所以直接使用 `p` 元素選擇器查找,這和使用 `jQuery` 類似。最后,可以斷言段落中的文本內(nèi)容應(yīng)該是“復(fù)習(xí) React Hooks 使用”。

6

可以看到測試通過。

## **編寫交互測試**

下面我們來測試當(dāng)點擊待辦事項列表項中的段落時,修改待辦事項的完成狀態(tài)。

Jest 中提供了 **`spy`** (間諜)的開箱即用的功能,一個 `spy` 是一個函數(shù),你不用關(guān)心它的實現(xiàn),只需關(guān)心它的調(diào)用時間與調(diào)用方式,當(dāng)我們要監(jiān)視函數(shù)時可以考慮使用它。

要修改待辦事項的完成狀態(tài),需要傳遞 `toggle` 屬性,它是一個函數(shù),我們現(xiàn)在來測試當(dāng)用戶點擊時,該函數(shù)被使用正確的參數(shù)進行調(diào)用。

首先使用 `jest.fn()` 創(chuàng)建一個 `spy`:

```js
const toggle = jest.fn()
```

這為我們提供了一個可以監(jiān)視并確保它被正確調(diào)用的函數(shù)。

接下來渲染 `TodoItem` 組件:

```js
const toggle = jest.fn()
const wrapper = mount(
  <TodoItem todo={todo} toggle={toggle} />
)
```

然后查找 DOM 節(jié)點并模擬用戶觸發(fā)點擊事件:

```js
const p = wrapper.find('p')
p.simulate('click')
```

`simulate()` 用于模擬用戶事件。

剩下的就是斷言 `spy` 函數(shù)被正確調(diào)用,整個測試應(yīng)該如下:

```js
test('點擊修改待辦事項狀態(tài)', () => {
  const toggle = jest.fn()
  const todo = {id: 2, title: '復(fù)習(xí) React Hooks 使用', completed: false}
  const wrapper = mount(
    <TodoItem todo={todo} toggle={toggle} />
  )
  const p = wrapper.find('p')
  p.simulate('click')
  expect(toggle).toBeCalledWith(2)
})
```

我們期望使用待辦事項的 id 作為參數(shù)進行調(diào)用,可以用 `expect(toggle).toBeCalledWith(2)` 來斷言。這樣,我們的測試就完成了:

7

測試通過。

## **總結(jié)**

Jest 被大量的使用,已成為 JavaScript 開發(fā)人員最愛的測試框架之一,相信它會變得更好。在測試方面,它擁有速度快、API 簡單、易配置、IDE 整合、多項目并行等優(yōu)勢,相信隨著大家的使用,你一定會愛上它的。

文章示例 Github 倉庫:[https://github.com/itrainhub/testing-react-with-jest](https://link.zhihu.com/?target=https%3A//github.com/itrainhub/testing-react-with-jest)

**- End -**

更多關(guān)于“web前端培訓(xùn)”的問題,歡迎咨詢千鋒教育在線名師。千鋒已有十余年的培訓(xùn)經(jīng)驗,課程大綱更科學(xué)更專業(yè),有針對零基礎(chǔ)的就業(yè)班,有針對想提升技術(shù)的提升班,高品質(zhì)課程助理你實現(xiàn)夢想。

tags:
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強師集結(jié),手把手帶你蛻變精英
請您保持通訊暢通,專屬學(xué)習(xí)老師24小時內(nèi)將與您1V1溝通
免費領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
抖音小店運營做什么的

在當(dāng)前的電商市場中,抖音小店已經(jīng)逐漸成為一種新的電商模式,它集成了社交化、音視頻分享、直播銷售等多種功能,使得消費者更加便捷地進行商品...詳情>>

2023-10-08 16:36:41
抖音小店照片要求尺寸多大

在抖音平臺開設(shè)小店已經(jīng)成為了越來越多人的選擇,相信大家已經(jīng)在各大社交平臺上看到有不少小店的推廣。在抖音上,照片是展示產(chǎn)品的重要手段,因...詳情>>

2023-10-08 16:14:25
抖音招商團長托管服務(wù)費怎么退回來

抖音招商團長托管服務(wù)是抖音為有意愿創(chuàng)作內(nèi)容并帶動其他創(chuàng)作者成為團隊成員的用戶提供的一種服務(wù)。通過該服務(wù),招商團長可以自主組建團隊并得到...詳情>>

2023-10-08 16:08:53
抖音小店怎么做代銷

抖音已經(jīng)成為了一個非常受歡迎的短視頻應(yīng)用程序,在其中許多用戶都精心打造了自己的小店,用于銷售各種各樣的商品,獲取額外的收入。然而,要想...詳情>>

2023-10-08 15:28:41
怎樣開抖音小店帶貨賺錢

隨著直播帶貨的火熱,越來越多的人開始嘗試通過抖音小店來開展帶貨業(yè)務(wù)。抖音小店是抖音直播帶貨的配套,可以讓用戶在購買直播中產(chǎn)品時就實現(xiàn)購...詳情>>

2023-10-08 15:06:36
色综合老司机第九色激情 _中文字幕日韩av资源站_国产+人+亚洲_久久久精品影院_久久久视频免费观看_欧美激情亚洲自拍_亚洲成av人片在线观看香蕉_热草久综合在线_欧美极品第一页_2020国产精品自拍
热久久免费视频| 色综合久久久久久久久久久| 一区免费观看视频| 不卡的电影网站| 99精品国产99久久久久久白柏| 久久午夜羞羞影院免费观看| 蜜臀久久久久久久| 欧美疯狂做受xxxx富婆| 老色鬼精品视频在线观看播放| 欧美日韩视频在线观看一区二区三区| 亚洲自拍偷拍欧美| 欧美一区二区三区视频免费播放 | 国产色婷婷亚洲99精品小说| 午夜成人免费电影| 成人欧美一区二区三区在线播放| 欧美日韩1234| 欧美日韩亚洲丝袜制服| 99re这里都是精品| 国产精品88av| 国产白丝精品91爽爽久久| 久久成人久久鬼色| 免费高清在线一区| 国精产品一区一区三区mba桃花| 亚洲欧美日本在线| 成人毛片视频在线观看| 亚洲国产日日夜夜| 亚洲色图在线播放| 国产一区二区美女| 91国产精品成人| 26uuu色噜噜精品一区二区| 一区二区成人在线观看| 国产精品69久久久久水密桃| 91黄视频在线观看| 亚洲欧洲精品天堂一级| 久久精品国产精品亚洲综合| 99视频有精品| 日韩精品专区在线影院重磅| 亚洲自拍与偷拍| 91精品久久久久久蜜臀| 亚洲日本中文字幕区| 99精品视频一区| 国产日韩精品视频一区| 视频一区视频二区中文字幕| 色久优优欧美色久优优| 亚洲欧洲成人精品av97| 91在线视频播放| 亚洲一区视频在线观看视频| 欧美在线免费播放| av不卡免费电影| 国产露脸91国语对白| 在线电影一区二区三区| 久久99热99| 亚洲一区二区综合| 精品sm在线观看| av爱爱亚洲一区| 国产成人夜色高潮福利影视| 亚洲精品久久久蜜桃| 日韩网站在线看片你懂的| 99久久精品情趣| 日本 国产 欧美色综合| 一二三四区精品视频| 日本一区免费视频| 制服丝袜中文字幕一区| 欧洲一区在线观看| www.激情成人| 成人自拍视频在线| 亚洲美女免费在线| 一卡二卡三卡日韩欧美| 一区二区三区免费看视频| 亚洲三级理论片| 国产精品麻豆视频| 亚洲国产成人自拍| 久久精品视频一区二区| 日本一区二区在线不卡| 精品播放一区二区| 国产婷婷色一区二区三区在线| 精品欧美乱码久久久久久1区2区| 精品久久久久久久久久久久久久久久久| 欧美一区二区三区视频| 久久午夜羞羞影院免费观看| 亚洲激情图片qvod| 国产乱人伦偷精品视频不卡| 一本大道久久a久久综合婷婷| 日韩一区二区三区av| 亚洲亚洲精品在线观看| 成人免费福利片| 国产丝袜欧美中文另类| 国产在线精品视频| 亚洲福利电影网| 亚洲图片另类小说| 日韩vs国产vs欧美| 午夜免费久久看| 久久爱另类一区二区小说| 亚洲激情自拍偷拍| 久久久九九九九| www成人在线观看| 中文字幕一区视频| 国产一区二区三区久久久| 懂色av中文一区二区三区| 91美女片黄在线观看91美女| 日韩精品中文字幕一区 | 欧美高清一级片在线| 欧美精品一区二区三区视频| 国产精品卡一卡二| 黄色资源网久久资源365| 91免费国产在线| 欧美极品aⅴ影院| 图片区小说区区亚洲影院| av中文一区二区三区| 国产精品传媒入口麻豆| 精品一区二区三区在线视频| 欧美精品久久久久久久久老牛影院| 国产精品亲子伦对白| 成人国产精品免费观看| 中文一区二区完整视频在线观看 | 最近中文字幕一区二区三区| 亚洲一区二区av在线| 欧美日韩国产精品成人| 天堂一区二区在线| 久久综合九色综合欧美98| 国内外成人在线| 亚洲靠逼com| 欧美老女人第四色| av电影在线观看一区| 亚洲福利视频一区二区| 久久久久久久久久美女| 色综合久久久久| 国产一区二区精品久久| 伊人婷婷欧美激情| 久久无码av三级| 日韩一区二区三| 欧美性大战久久| 粉嫩av一区二区三区在线播放| 一区二区成人在线观看| 国产精品美女久久久久久久久 | 欧美日韩dvd在线观看| 97超碰欧美中文字幕| 日本伊人精品一区二区三区观看方式| 中文字幕高清不卡| 国产精品毛片高清在线完整版| 欧美精品一区二区三区高清aⅴ| 欧美一级一区二区| 欧美在线观看禁18| 欧美日韩精品一区二区在线播放| 色婷婷综合久久久久中文| 91麻豆国产在线观看| 精品视频1区2区3区| 精品奇米国产一区二区三区| 久久精品在这里| 国产日韩综合av| 亚洲美女在线国产| 蜜桃久久久久久| 成人高清在线视频| 91色在线porny| 91精品国产手机| 亚洲天堂精品在线观看| 日韩电影在线观看电影| 色综合天天综合色综合av| 日韩精品一区二| 亚洲综合另类小说| 91性感美女视频| 亚洲精品一区二区三区精华液 | 日韩成人一级片| 成人深夜视频在线观看| 欧美人牲a欧美精品| 精品日韩欧美一区二区| 亚洲国产精品麻豆| 欧美亚洲国产bt| 一区二区三区四区激情 | 国内成人自拍视频| 日韩视频在线你懂得| 强制捆绑调教一区二区| 欧美一卡2卡3卡4卡| 免费成人av在线| 欧美精品一区二区三区一线天视频 | 又紧又大又爽精品一区二区| 中国av一区二区三区| 亚洲精品欧美在线| 奇米色777欧美一区二区| 蜜臀av性久久久久蜜臀aⅴ四虎| 日韩**一区毛片| 日韩限制级电影在线观看| 色综合咪咪久久| 国产人妖乱国产精品人妖| 日韩视频一区在线观看| 综合在线观看色| 热久久免费视频| 日韩一级黄色大片| 精品一区二区三区在线观看| 91麻豆成人久久精品二区三区| 精品免费视频.| 国产成人在线电影| 精品对白一区国产伦| 国产精品网站导航| 国产精品一区二区x88av| 欧美三区在线观看| 成a人片国产精品| 色婷婷综合视频在线观看| 日本一区二区三区四区在线视频 | 久久综合九色综合久久久精品综合|