精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Jest:給你的 React 項目加上單元測試

開發(fā) 前端
單元測試(Unit Testing),指的是對程序中的模塊(最小單位)進行檢查和驗證。比如一個函數、一個類、一個組件,它們都是模塊。

大家好,我是前端西瓜哥。

Jest 是一款輕量的 JavaScript 測試框架,它的賣點是簡單好用,由 facebook 出品。本文就簡單講講如何使用 Jest 對 React 組件進行測試。

為什么需要單元測試?

單元測試(Unit Testing),指的是對程序中的模塊(最小單位)進行檢查和驗證。比如一個函數、一個類、一個組件,它們都是模塊。

使用單元測試的優(yōu)點:

  • 更好地交付高質量代碼。代碼不可能沒有 bug,測試能幫你找出來;
  • 更容易重構。我們不愿意去重構代碼,不去還技術債,很大原因是測試覆蓋率不足,害怕遺漏一些邊邊角角的邏輯,導致線上發(fā)生重大事故;
  • 可以用測試描述模塊功能。注釋和文檔容易忘記修改,但測試用例的描述永遠是準確的,因為不對就無法通過測試;
  • 可測試性好的代碼,往往可維護性更好。比如某個模塊很難測試,是因為它和其他模塊高度耦合,此時你需要替換為依賴注入的方式來管理模塊依賴。

Jest 判定測試腳本

Jest 需要 確認哪些是測試文件,默認判斷測試文件的邏輯是:

  • __tests__? 文件夾下的 .js  .jsx、.ts 、.tsx 為后綴的文件。
  • test.js? 、spec.js 或其他文件后綴  .jsx、.ts 、.tsx。

可以通過設置  Jest 配置文件的 testMatch 或 testRegex 選項進行修改,或者 package.json 下的 "jest" 屬性。

Jest 基本使用

我們先寫一個簡單的函數,作為被測試的模塊。

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

然后我們用 Jest 來做測試。

import sum from './sum';

test('1 + 1 應該等于 2', () => {
expect(sum(1, 1)).toBe(2);
});

然后執(zhí)行 jest 命令,得到測試結果。

圖片

test 方法創(chuàng)建了一個測試的作用域,該方法有三個參數:

  1. 測試的描述。
  2. 我們寫測試代碼的函數。
  3. 測試超時時間,默認為 5 秒,有些測試是異步的,我們需要等待。

test 方法有一個別名叫做 it,二者的功能是一致的,只是語義不同。通常用 test,但在某些情況下更適合用 it。這種情況就是 it 可以和描述語句拼成一句話的時候,比如:

it('should be true', () => { /* 測試內容 */});

it 方法和后面的 should be true 拼成了一句主語為 it 的句子,語義更好。

我們通常使用 expect 來測試一個模塊的邏輯是否符合預期。expect 會將模塊返回的結果封裝成一個對象,然后提供非常豐富的方法做測試。

比如 toBe 就可以做 Object.is 的對比測試。

// sum(1, 1) 的結果是否為 2
expect(sum(1, 1)).toBe(2);

expect 的實現思路大致為:

function expect(value) {
return {
toBe(comparedValue) {
if (Object.is(value, comparedValue)) {
// 記錄測試成功
} else {
// 記錄測試失敗
}
},
// 其他 API
toBeTruthy() { /* ... */ },
// ...
}
}

利用了閉包。

還有一些其他的 toXX API,我們稱為 matcher。比如:

  • toEqual:對對象進行深遞歸的 Object.is 對比。
  • toBeTruthy:是否為真值。
  • not:對結果取反,比如expect(val).not.beBe(otherVal) 表示兩值不相等才通過測試。
  • toContain:數組中是否含有某個元素。
  • toBeLessThan:是否小于某個值,可以做性能測試,執(zhí)行某個函數幾千次,時間不能高于某個值。

更多 API 可以看文檔:

??https://jestjs.io/docs/expect。??

你可以用 describe 方法將多個相關的 test 組合起來,這樣能讓你的測試用例更好地被組織,測試報告輸出也更有條理。

describe('一個有多個屬性的對象的測試', () => {
test('test 1', async () => {
expect(obj.a).toBeTruthy();
});

test('test 2', async () => {
expect(obj.b).toBeTruthy();
});
});

describe 里面可以嵌套 describe,即組里面還可以有組。

異步測試

如果使用異步測試,需要將 Promise 作為返回值。

test('請求測試', () => {
return getData().then(res {
expect(res.data.success).toBe(true);
})
})

或使用 async / await。

test('請求測試', async () => {
const res = await getData();
expect(res.data.success).toBe(true);
})

也支持回調函數風格的測試,你需要調用函數傳入的 done 函數來表明測試完成:

test('異步測試', done => {
setTimeout(() {
expect('前端西瓜哥').toBeTruthy();
done();
}, 2000);
});

生命周期函數

beforeAll,在當前文件的正式開始測試前執(zhí)行一次,適合做一些每次 test 前都要做的初始化操作,比如數據庫的清空以及初始化。

beforeEach,在當前文件的每個 test 執(zhí)行前都調用一次。

afterAll,在當前文件所有測試結束后執(zhí)行一次,適合做一些收尾工作,比如將數據庫清空。

afterEach,在當前文件的每個 test 執(zhí)行完后都調用一次。

React Testing Library

本文不講解安裝和配置,我們先用 CreateReactApp 來搭建項目,并使用 TypeScript 模板。

yarn create react-app jest-app --template typescript

執(zhí)行單元測試的命令為:

yarn test

CreateReactApp 內置了 Jest,但 Jest 本身并不支持 React 組件的測試 API,需要使用另外一個內置的 React Testing Library 庫來測試  React 組件。

React Testing Library 是 以用戶為角度 的測試庫,能夠模擬瀏覽器的 DOM,將 React 組件掛載上去后,我們使用其提供的一些模擬用戶操作的 API 進行測試。

React Testing Library 的哲學是:

測試的寫法越是接近應用被使用的方式,我們就越有自信將其交付給客戶。

CreateReactApp 預置模板的 App.test.tsx 使用了 React Testing Library。

import React from 'react';
import { render, screen } from '@testing-library/react';
import App from './App';

test('renders learn react link', () => {
render(<App);
const linkElement = screen.getByText(/learn react/i);
expect(linkElement).toBeInTheDocument();
});

Enzyme

另一種比較流行的測試 React 組件的框架是  Enzyme,它的 API 簡潔優(yōu)雅,能夠用類似 JQuery 的語法,對開發(fā)非常友好。Enzyme 由 Airbnd 出品,但目前已經不怎么維護了。

為此,你需要裝一些包:

yarn add -D enzyme enzyme-adapter-react-16

如果你使用了 TS,你還得補上類型聲明。

yarn add -D @types/enzyme @types/enzyme-adapter-react-16

示例:

import Enzyme, { shallow } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
import Button from '../button';
Enzyme.configure({ adapter: new Adapter() });
it('Button with children', () => {
const text = 'confirm';
const btn = shallow(<Button>{text}</Button>);
expect(btn.text()).toBe(text);
});

目前(2022.10.25) enzyme 官方只支持到 React 16,Enzyme 已死:

??https://dev.to/wojtekmaj/enzyme-is-dead-now-what-ekl。??

使用 Jest 測試 React 組件

我們先實現一個簡單的 Button 組件。

import { CSSProperties, MouseEvent, FC } from 'react';
import classNames from 'classnames';
import './style.scss';

const clsPrefix = 'xigua-ui-btn';

export type ButtonProps = {
type?: 'primary' | 'default'
size?: 'large' | 'middle' | 'small';
disabled?: boolean;
children?: React.ReactNode;
onClick?: (event: MouseEvent) => void;
style?: CSSProperties;
className?: string;
}

const Button: FC<ButtonProps> = (props) => {
const {
type = 'default',
size = 'middle',
disabled = false,
children,
onClick,
style,
className,
} = props;

const mixedClassName = classNames(
clsPrefix,
`${clsPrefix}-${type}`,
`${clsPrefix}-${size}`,
className
);

return (
<button
style={style}
className={mixedClassName}
disabled={disabled}
onClick={onClick}
>
{children}
</button>
);
};

export default Button;

然后我們創(chuàng)建一個 button.test.tsx 測試文件。我們使用 React Testing Library。

我們寫個測試。

import { render, screen } from '@testing-library/react';
import Button from '../button';

test('Button with children', () => {
const text = 'confirm Btn';
render(<Button>{text}</Button>);

screen.debug();
});

render 方法會將 React 組件掛載到虛擬的文檔樹上。screen.debug() 用于調試,能讓我們看到虛擬樹的完整結構。

<body>
<div>
<button
class="xigua-ui-btn xigua-ui-btn-default xigua-ui-btn-middle"
>
confirm Btn
</button>
</div>
</body>

測試 Button 的文本內容是否正常顯示:

test('Button with children', () => {
const text = 'confirm Btn';
// 渲染 Button 組件
render(<Button>{text}</Button>);

// 找到內容為 text 的元素
const BtnElement = screen.getByText(text);
// 測試元素是否在 Document 上
expect(BtnElement).toBeInTheDocument();
});

測試 Button 的 onClick 能否正常觸發(fā):

test('Button click', () => {
let toggle = false;
render(<Button onClick={() => { toggle = true; }} />);

// 找到第一個 button 元素,然后觸發(fā)它的點擊事件
fireEvent.click(screen.getByRole('button'));
// 看看 toggle 變量是否變成 true
expect(toggle).toBe(true);
});

測試 Button 的 className 是否成功添加:

test('Button with custom className', () => {
const customCls = 'customBtn';
render(<button className={customCls} />);

// 找到按鈕元素
const btn = screen.getByRole('button');
// 元素的 className 列表上是否有我們傳入的 className
expect(btn).toHaveClass(customCls);
});

源碼:

??https://github.com/F-star/xigua-ui/blob/main/src/components/button/??tests/button.test.tsx。

執(zhí)行 yarn test :

圖片

結尾

為了讓代碼更健壯,做模塊的單元測試還是有必要的,Jest 作為流行的測試庫值得一試。

責任編輯:姜華 來源: 前端西瓜哥
相關推薦

2020-03-19 14:50:31

Reac單元測試前端

2021-10-12 19:16:26

Jest單元測試

2017-01-14 23:42:49

單元測試框架軟件測試

2017-09-13 15:05:10

React前端單元測試

2017-09-10 17:41:39

React全家桶單元測試前端測試

2023-07-26 08:58:45

Golang單元測試

2011-05-16 16:52:09

單元測試徹底測試

2011-07-27 17:02:12

Xcode iPhone 單元測試

2009-06-26 17:48:38

JSF項目單元測試JSFUnit

2017-01-16 12:12:29

單元測試JUnit

2017-01-14 23:26:17

單元測試JUnit測試

2021-09-18 15:40:03

Vue單元測試命令

2011-06-14 15:56:42

單元測試

2020-08-18 08:10:02

單元測試Java

2022-05-12 09:37:03

測試JUnit開發(fā)

2017-03-23 16:02:10

Mock技術單元測試

2021-05-05 11:38:40

TestNGPowerMock單元測試

2020-05-07 17:30:49

開發(fā)iOS技術

2011-07-04 18:16:42

單元測試

2024-10-16 16:09:32

點贊
收藏

51CTO技術棧公眾號

紧缚奴在线一区二区三区| 成人影视亚洲图片在线| 欧美日韩激情视频8区| 免费中文日韩| 一级做a爱片性色毛片| 欧美a级片网站| 日韩av资源在线播放| 国产成人手机视频| 1024在线播放| 91免费小视频| 91色精品视频在线| 国产在线观看黄色| 亚洲综合激情在线| 亚洲乱码一区二区| 久久久九九九热| 成人片免费看| 亚洲欧美视频在线观看视频| 久久婷婷人人澡人人喊人人爽| 国产又粗又猛又爽| 国产精品外国| 久久99热精品| 奇米网一区二区| 欧美aaaaa级| 欧美一区二区视频免费观看| 国产极品美女高潮无套久久久| 四季久久免费一区二区三区四区| 久久精品一区二区三区av| 亚洲a中文字幕| 中文字幕av网站| 中日韩视频在线观看| 久久成人精品视频| 91无套直看片红桃在线观看| 欧美成人基地| 亚洲成色777777女色窝| 天堂中文av在线| 成人mm视频在线观看| 欧美日韩黄色大片| 青娱乐自拍偷拍| 欧美人体视频xxxxx| 中文字幕在线观看不卡| 日韩理论片在线观看| 天天射,天天干| 国产福利一区二区三区| 国产日韩中文在线| 中文字幕在线2018| 日韩在线一区二区| 国产精品白嫩美女在线观看| 无码人妻丰满熟妇精品| 久久久久国内| 91tv亚洲精品香蕉国产一区7ujn| 国产亚洲欧美久久久久| 欧美日韩国产高清| 欧美激情免费观看| 久草国产在线观看| 黑丝一区二区三区| 欧美激情女人20p| 精品一区在线视频| 亚洲无吗在线| 91国产精品91| 久久露脸国语精品国产91| 一区三区视频| 91精品国产亚洲| 日韩欧美三级视频| 午夜亚洲激情| 欧美在线免费看| 无码一区二区三区在线观看| 日韩影院精彩在线| 国产噜噜噜噜久久久久久久久| 亚洲在线精品视频| 国产一区视频网站| 国产成人亚洲欧美| 欧美日韩在线三级| 亚洲精品www.| 精品一区二区三区中文字幕视频| 欧美一二三四在线| 在线观看一区二区三区四区| 欧美18xxxx| 在线亚洲男人天堂| 91久久国产综合| 韩日视频一区| 欧洲成人免费视频| 中文字幕人妻丝袜乱一区三区 | 2020国产精品久久精品美国| 欧美日韩精品免费看| 成人av一区| 亚洲欧美福利一区二区| www插插插无码视频网站| 亚洲十八**毛片| 欧美日韩夫妻久久| 中文字幕乱视频| 国产一区网站| 欧美成人高清视频| 久久久久久久久久久影院| 蜜臀91精品一区二区三区 | 荡女精品导航| 国产视频欧美视频| 欧洲美女女同性互添| 亚洲精品激情| 成人av在线天堂| 日本人妻丰满熟妇久久久久久| 国产日韩亚洲欧美综合| 九一免费在线观看| 成人在线爆射| 精品欧美久久久| 青青青手机在线视频| 伊人久久综合| 91丝袜美腿美女视频网站| 日夜干在线视频| 伊人夜夜躁av伊人久久| 亚洲成人av免费看| 精品国内亚洲2022精品成人| 日韩在线观看免费网站| 日韩欧美国产亚洲| 狠狠狠色丁香婷婷综合激情| 欧美一区二区福利| 国精产品一区一区三区mba下载| 欧美午夜片在线观看| 呦呦视频在线观看| 欧美日韩91| 91精品国产自产在线老师啪| 欧美中文在线| 亚洲高清在线精品| www激情五月| 欧美色婷婷久久99精品红桃| 91精品国产91久久久久久不卡| 国产乱码一区二区| 日本一区二区成人| 91黄色小网站| 欧美顶级毛片在线播放| 色综合天天综合网国产成人网| 曰批又黄又爽免费视频| 久久久久久日产精品| 青草青青在线视频| 亚州一区二区| 久热精品在线视频| 91在线你懂的| 国产精品伦理在线| 色哟哟精品视频| 国产亚洲电影| 欧洲日韩成人av| 日韩一二三四| 欧美日韩在线另类| 玖草视频在线观看| 99riav国产精品| 国产日韩欧美一区二区三区四区| 亚洲淫性视频| 日韩小视频在线观看专区| 国产suv精品一区二区68| 久久99九九99精品| 一区二区三区三区在线| 亚洲精品成a人ⅴ香蕉片| 国产一区二区三区视频在线观看| 日韩免费av网站| 国产欧美精品一区二区色综合| 欧美成人免费高清视频| 免费看成人哺乳视频网站| 日韩av成人在线| 九色在线视频蝌蚪| 欧美三级欧美一级| 欧美色视频一区二区三区在线观看| 麻豆国产精品视频| 免费观看黄色大片| 一区二区三区在线资源| 9.1国产丝袜在线观看| 欧洲一区av| 欧美手机在线视频| 2014亚洲天堂| 国产成人精品亚洲777人妖| 青青草国产精品视频| 亚洲成a人片77777在线播放| 国产精品久久久久7777婷婷| 国精产品一区| 精品蜜桃在线看| 最新中文字幕一区| 国产精品视频一二三区| 中文字幕 欧美日韩| 国产精品草草| 日本午夜精品一区二区三区| 大胆国模一区二区三区| 欧美—级a级欧美特级ar全黄| 日韩美女一级视频| 欧美系列在线观看| 九九精品在线观看视频| 久久久久成人黄色影片| 中文字幕成人免费视频| 亚洲国产免费| 水蜜桃亚洲一二三四在线| 亚洲视频资源| 欧美孕妇孕交黑巨大网站| 色老头视频在线观看| 精品黑人一区二区三区久久| 国产精品第5页| 亚洲欧美日韩国产综合| 一区二区三区少妇| 精品在线播放午夜| 18岁网站在线观看| 亚洲第一偷拍| 日本午夜精品一区二区三区| 91精品国产自产在线丝袜啪| 国产成人精品日本亚洲专区61| caopen在线视频| 亚洲视频综合网| 亚洲精品18在线观看| 欧美伊人久久大香线蕉综合69 | 国产一区日韩一区| 日本一区二区三区免费看| 精品午夜av| 国产精品99久久久久久久久| 超清av在线| 久久精品电影网| 福利视频在线导航| 亚洲国产精品热久久| 国产精品视频无码| 在线观看免费成人| 中文字幕亚洲精品一区| 亚洲美女屁股眼交3| 男人的天堂官网| av一二三不卡影片| 国产欧美视频一区| 国产在线播精品第三| 99草草国产熟女视频在线| 亚洲国产网站| 国产视频在线观看网站| 国产精品99视频| 日韩中文一区二区三区| 亚洲最大在线| 精品综合在线| 国产成人一二片| 91精品婷婷国产综合久久蝌蚪| 国产极品一区| 日韩美女中文字幕| 波多野结衣亚洲一二三| 97激碰免费视频| 欧美激情成人动漫| 欧美床上激情在线观看| 黄页视频在线播放| 中文字幕亚洲综合久久| 福利成人在线观看| 国产一区二区三区视频免费| 理论在线观看| 亚洲美女av在线播放| 欧美一区二区黄片| 亚洲第五色综合网| 人人妻人人澡人人爽人人欧美一区| 日韩欧美一区二区三区在线| 国产男男gay网站| 717成人午夜免费福利电影| 96亚洲精品久久久蜜桃| 欧美蜜桃一区二区三区| 亚洲网站免费观看| 在线成人免费视频| 国产精品一区二区免费视频| 欧美丰满嫩嫩电影| 国产免费无遮挡| 欧美大片在线观看一区二区| 午夜免费福利视频| 亚洲第一网站免费视频| 污视频软件在线观看| 亚洲精品美女在线| 嫩草研究院在线| 中文字幕欧美日韩精品| 免费a级人成a大片在线观看| 久久婷婷国产麻豆91天堂| √天堂8在线网| 国内精品久久久久久影视8| 麻豆mv在线看| 国产成人鲁鲁免费视频a| h1515四虎成人| 96久久精品| 色爱av综合网| 一本色道久久99精品综合| 亚洲大全视频| 激情五月宗合网| 日产国产欧美视频一区精品| 亚洲精品手机在线观看| 国产精品亚洲专一区二区三区 | 蜜臀久久99精品久久久酒店新书 | 特级黄色片视频| 成人自拍视频在线| 精品无码人妻一区二区免费蜜桃 | 国产日本欧美在线| 亚洲小说欧美另类社区| 无遮挡又爽又刺激的视频| 精品伊人久久久久7777人| 日批视频免费看| 久久精品男人的天堂| 日韩a级片在线观看 | 色综合久久久久无码专区| 老司机精品视频网站| 五月天婷婷在线观看视频| av亚洲精华国产精华精| 国产精品综合激情| 亚洲主播在线播放| 欧美视频xxxx| 精品国产三级电影在线观看| 国产精品视频二区三区| 欧美黑人国产人伦爽爽爽| 性欧美18一19sex性欧美| 亚洲精品欧美一区二区三区| 一个色免费成人影院| 一区二区三区四区欧美| 一区二区日本视频| 欧美成人福利在线观看| 91色|porny| 免费在线视频观看| 欧美日韩一二区| 五月色婷婷综合| 九色成人免费视频| 电影在线观看一区二区| 精品一区二区日本| 亚洲情侣在线| 视色视频在线观看| 97aⅴ精品视频一二三区| 黄色录像免费观看| 91久久精品一区二区三| 免费观看国产精品| 久久影视免费观看| 国产精品亚洲d| 久久久久网址| 亚洲国产一区二区三区a毛片| 日韩成人av免费| 国产欧美一区二区精品性色超碰| 欧美日韩中文视频| 91精品国产色综合久久不卡蜜臀 | 黄色三级中文字幕| 久久99精品久久久久久久久久久久| 黄色正能量网站| 亚洲成人一二三| 亚洲va欧美va| 久久亚洲精品一区| 亚洲日本免费电影| 一区二区视频在线播放| 日韩av在线发布| 国产美女免费无遮挡| 懂色av影视一区二区三区| 蜜臀久久精品久久久久| 欧美激情网站在线观看| 精品视频在线播放一区二区三区| 一区二区三区av在线| 六月丁香综合在线视频| 欧美a在线播放| 欧美性猛交xxxxxxxx| 在线看黄色av| 国产日韩av在线| 国产韩国精品一区二区三区| www.久久91| 日韩美女啊v在线免费观看| 一本色道久久综合熟妇| 精品国内产的精品视频在线观看| 欧美性aaa| 在线观看欧美激情| 极品销魂美女一区二区三区| 国产日产精品一区二区三区的介绍| 欧美高清你懂得| 在线中文字幕-区二区三区四区| 91九色视频在线| 欧美激情1区2区| 私密视频在线观看| 色噜噜狠狠成人中文综合| 国产福利片在线| 国产日韩欧美中文在线播放| 亚洲精品91| 怡红院一区二区| 欧美午夜美女看片| 69视频在线观看| 91精品视频免费| 国产一在线精品一区在线观看| 逼特逼视频在线观看| 狠狠躁天天躁日日躁欧美| 国产资源在线播放| 91精品视频一区| 亚洲黄色成人| 免费看污片的网站| 欧美浪妇xxxx高跟鞋交| 国产黄色大片在线观看| 免费亚洲精品视频| 久草在线在线精品观看| 久久激情免费视频| 日韩成人免费视频| 成人在线视频观看| 800av在线免费观看| 久久综合国产精品| 国产精品伦一区二区三区| 久久久久久中文字幕| 国产欧美日韩在线观看视频| 午夜免费一级片| 懂色av中文一区二区三区天美| 国产精品免费观看| www 成人av com| 丝袜亚洲另类丝袜在线| 2021亚洲天堂| 亚洲香蕉在线观看| 北条麻妃一区二区三区在线观看| 国产精品动漫网站| 一区二区三区波多野结衣在线观看| 日韩二区三区| 99re视频| 美女尤物国产一区| 欧美日韩乱国产| 美女国内精品自产拍在线播放|