vue-test-utils初使用詳解
vue-test-utils官網(wǎng):https://vue-test-utils.vuejs.org/zh/
jest官網(wǎng):https://jestjs.io
依賴包
請安裝它們👇
yarn add @vue/test-utils vue-jest yarn jestjest-serializer-vue yarn add babel-jest babel-core@^7.0.0-bridge.0
⚠️:vue-jest依賴與babel-core。我們的環(huán)境現(xiàn)在都是babel7,通過npm安裝的babel-core默認(rèn)的還是6版本,所以要指定babel-core安裝的系列為7,否則會出現(xiàn)解析問題。
配置
jest配置:告訴jest它需要哪些額外的配置
jest相關(guān)的配置可以配置在package.json中或者單獨(dú)的jest.config.json文件中:
// jest.config.json
{
"moduleFileExtensions": [
"js",
"json",
"vue"
],
"transform": {
"^.+\\.js$": "<rootDir>/node_modules/babel-jest", // jest使用babel解析js
".*\\.(vue)$": "<rootDir>/node_modules/vue-jest" // jest對vue單文件的解析
},
"snapshotSerializers": [
"<rootDir>/node_modules/jest-serializer-vue"
],
"moduleNameMapper": {
"^@/(.*)$": "<rootDir>/src/$1", //為了解析webpack配置的alias字段
"^tim-architect/(.*)$": "<rootDir>/tim-architect/$1"
},
"transformIgnorePatterns": [
"node_modules/(?!(yourModuleName))"
]
}
⚠️:transformIgnorePatterns的默認(rèn)配置是["node_modules"],表示所有的node_modules下的包都不需要babel解析。但是一些3rd庫提供的文件仍然是未編譯的es6語法,jest在解析時(shí)會報(bào)語法錯誤。因此需要指定白名單,需要那些node_modules下的包被babel轉(zhuǎn)換。
babel配置:告訴babel你需要用哪些工具去處理一坨(💩香么 ?💩 : 💩 )代碼
推薦使用babel.config.js(babel需要轉(zhuǎn)換的node_modules同樣生效)而不是.babelrc(當(dāng)前項(xiàng)目生效)。
{
...,
env: {
test: {
presets: [[
'@babel/env',
{
modules: 'auto', // 現(xiàn)在不能通過webpack來解析s6 module,需要使用babel來解析,所以要開啟
targets: {
node: 'current' // 指定環(huán)境為當(dāng)前node版本,減少解析不識別語法的范圍
}
}
]],
plugins: [[
'@babel/plugin-transform-runtime', {
corejs: 2,
useESModules: false // 不允許使用es modules,babel需要通過@babel/plugin-transform-modules-commonjs將es module轉(zhuǎn)換為commonjs模塊解析
}
]
]
}
}
}
⚠️:通過babel的env.test指定jest測試時(shí)需要的babel配置(同webpack轉(zhuǎn)換解析時(shí)不同),jest會自動識別env.test的配置。
單測文件
理解:
- 單元測試不應(yīng)該追求代碼的覆蓋率;
- 單元測試主要是為了測試組件UI,數(shù)據(jù)驅(qū)動后UI的變化在可控范圍之內(nèi);
- 測試組件應(yīng)以純組件為主(業(yè)務(wù)組件邏輯過于復(fù)雜或經(jīng)常變動,涉及到的引入文件過多,不便于測試所有的功能性),純組件作為項(xiàng)目的基礎(chǔ)組件功能性上基本不變化。
遇到的問題總結(jié)
1.異步生命周期
vue-test-utils提供了對異步請求方法的mock,文檔如下:https://vue-test-utils.vuejs.org/zh/guides/testing-async-components.html
但是對于生命周期函數(shù)是異步的情況要怎么處理呢?以下是親測有效但是有點(diǎn)麻煩的姿勢:
// 假設(shè)在異步生命周期方法中,調(diào)用的函數(shù)是init,那我們就通過jest.fn()提供的方法進(jìn)行mock
init.default = jest.fn().mockImplementation(() => Promise.resolve(yourValue))
// 在Jest提供的全局方法中,調(diào)用異步生命周期的方法,以保證每個斷言都是在生命周期之后
beforeEach(async () => {
init.default.mockClear()
await wrapper.vm.$mount() // 異步生命周期里會調(diào)用init方法
})
2.如果測試文件中包含require.context,請看這一條 :
這時(shí)候沒有webpack怎么辦?當(dāng)然是用別人踩過坑的方法救急!
說實(shí)話,如果組件引用了這種東西,我覺得它不夠純潔,還是不要管它好了╮( ̄⊿ ̄")╭,放它走吧。
但是為什么要解決這個問題呢?想到以后可能還要測試js文件,我們的標(biāo)準(zhǔn)也有可能是覆蓋代碼行數(shù)的測試,所以,還是解決一下吧。
其實(shí)思路很簡單,我們需要在全局重寫require.context,babel再遇到require.context就不會報(bào)錯了。
// 別怕,不需要你手動寫,有人已經(jīng)寫了個插件了:babel-plugin-require-context-hook // 在babel.config.js的env.test中加上這個插件 ... plugins: [..., 'require-context-hook'] ... // 在jest.config.json中配置一下setupFiles // setupFiles表示在每個運(yùn)行文件前添加的額外配置 ... "setupFiles": ["<rootDir>/.jest/register-context.js"], ... // 創(chuàng)建.jest/register-context.js文件,引入時(shí)進(jìn)行全局的注冊 import registerRequireContextHook from 'babel-plugin-require-context-hook/register'; registerRequireContextHook();
3.測試過程總是報(bào)synax error ,諸如import無法解析這類es6語法引起的錯誤
小兄弟,只能說好好檢查一下你的babel是否配置正確,并且安裝了適合的babel-core版本。出現(xiàn)這個問題的時(shí)候,說明babel并沒有解析es6語法,順藤摸瓜,
(確保依賴包的安裝源相同,建議用yarn)
- if 是node_modules里的文件導(dǎo)致的,通過配置transformIgnorePatterns告訴babel需要它解析的模塊;
- else if 是項(xiàng)目的文件導(dǎo)致的,那就查看下自己的babel.config.js(確保不是.babelrc文件)是否配置正確,如果使用了@babel/preset-env,請注意module參數(shù)的配置;
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue實(shí)現(xiàn)登陸登出的實(shí)現(xiàn)示例
本篇文章主要介紹了vue實(shí)現(xiàn)登陸登出的實(shí)現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
vue點(diǎn)擊Dashboard不同內(nèi)容 跳轉(zhuǎn)到同一表格的實(shí)例
這篇文章主要介紹了vue點(diǎn)擊Dashboard不同內(nèi)容 跳轉(zhuǎn)到同一表格的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
vue路由傳參之使用query傳參頁面刷新數(shù)據(jù)丟失問題解析
這篇文章主要介紹了vue路由傳參使用query傳參頁面刷新數(shù)據(jù)丟失問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
Vue3?接入?i18n?實(shí)現(xiàn)國際化多語言案例分析
在?Vue.js?3?中實(shí)現(xiàn)網(wǎng)頁的國際化多語言,最常用的包是?vue-i18n,通常我們會與?vue-i18n-routing?一起使用,這篇文章主要介紹了Vue3?如何接入?i18n?實(shí)現(xiàn)國際化多語言,需要的朋友可以參考下2024-07-07
vue3+vite+TS中使用element-plus按需引入ElLoading、ElMessage樣式失效解決
在項(xiàng)目中使用elementui確實(shí)是很方便的一件事,下面這篇文章主要給大家介紹了關(guān)于vue3+vite+TS中使用element-plus按需引入ElLoading、ElMessage樣式失效解決的相關(guān)資料,需要的朋友可以參考下2023-02-02
vue2移動端+swiper實(shí)現(xiàn)異形的slide方式
這篇文章主要介紹了vue2移動端+swiper實(shí)現(xiàn)異形的slide方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03

