最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue中如何使用jest單元測試

 更新時間:2022年08月15日 15:32:45   作者:風舞紅楓  
這篇文章主要介紹了vue中如何使用jest單元測試,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

當我初次聽到單元測試時,心里的第一感覺就兩個字nb,然后就是疑惑,這是啥,干啥用,對代碼又有什么幫助?接下來我會細細說一說我在學習以及應用單元測試的一些心得。(安裝教程不再敘述,按照文檔教程自行學習)

文檔推薦

學習新知識,有中文文檔當然是最好的啦!

組件掛載相關方法

shallowMount

shallowMount:

創(chuàng)建一個包含被掛載和渲染的 Vue 組件的 Wrapper。與之對應的還有一個mount。

shallowMount與mount的區(qū)別:

在文檔中描述為"不同的是被存根的子組件",大白話就是shallowMount不會加載子組件,不會被子組件的行為屬性影響該組件。

為什么使用shallowMount而不使用mount:

我認為單元測試的重點在"單元"二字,而不是"測試",想測試子組件再為子組件寫對應的測試代碼即可。

import { shallowMount } from '@vue/test-utils'
import Foo from './Foo.vue'
describe('Foo', () => {
? ? const wrapper = shallowMount(Foo)
})

Wrapper(這里只記錄一些我經(jīng)常使用的)

  • Wrapper:Wrapper 是一個包括了一個掛載組件或 vnode,以及測試該組件或 vnode 的方法。
  • Wrapper.vm:這是該 Vue 實例。你可以通過 wrapper.vm 訪問一個實例所有的方法和屬性。
  • Wrapper.classes:返回是否擁有該class的dom或者類名數(shù)組。
  • Wrapper.find:返回第一個滿足條件的dom。
  • Wrapper.findAll:返回所有滿足條件的dom。
  • Wrapper.html:返回html字符串。
  • Wrapper.text:返回內容字符串。
  • Wrapper.setData:設置該組件的初始data數(shù)據(jù)。
  • Wrapper.setProps:設置該組件的初始props數(shù)據(jù)。
  • Wrapper.trigger:用來觸發(fā)事件。
<template>
?? ?<div class="jest">
?? ??? ?<div class="name">{{name}}</div>
?? ??? ?<div class="name">{{name}}{{text}}</div>
?? ??? ?<div class="text" @click="add">{{text}}</div>
?? ?</div>
</template>
<script src="./script.js">
export default {
?? ?name:"Foo",
?? ?props:{
?? ??? ?name:{
?? ??? ??? ?type: String,
?? ??? ??? ?default: '王大大'
?? ??? ?}
?? ?},
? ? data() {
? ? ? ? return {
? ? ? ? ? ? text: 123
? ? ? ? }
? ? },
? ? methods:{
? ? ?? ?add(){
?? ??? ??? ?this.text += 1
?? ??? ?}
? ? }
}
</script>
import { shallowMount } from '@vue/test-utils'
import Foo from './Foo.vue'
describe('Foo', () => {
? ? const wrapper = shallowMount(Foo)
? ? console.log(Wrapper.classes())?? ?//['jest','name','test']
? ? console.log(Wrapper.classes('jest'))?? ?//true
? ? console.log(Wrapper.find('name').text())?? ?//返回第一個class是name的dom的內容 ? 王大大
? ? console.log(Wrapper.findAll('name'))?? ?//返回dom數(shù)組
? ? console.log(Wrapper.findAll('name').at(0))?? ?//取dom數(shù)組中的第一個
? ? Wrapper.setData({text : 1})
? ? console.log(Wrapper.vm.text)?? ?//1
? ? Wrapper.setProps({name : "李大大"})
? ? console.log(Wrapper.vm.name)?? ?//李大大
? ? Wrapper.find('text').trigger("click")
? ? console.log(Wrapper.vm.text) // 2
})

掛載選項

就是shallowMount或者mount的時候可以設置一些初始化內容。具體可以初始化的全部內容請查詢文章開始的文檔。

import { shallowMount } from '@vue/test-utils'
import Foo from './Foo.vue'
const wrapper = shallowMount(Foo, {
?? ?data() {
?? ??? ?return {
?? ??? ??? ?bar: 'my-override'
?? ??? ?}
? },
? propsData: {
?? ??? ?msg: 'aBC'
? }
? mocks: {
? ? ? ? $route: {
? ? ? ? ? ? query: {
? ? ? ? ? ? ? ? aaa: '1',
? ? ? ? ? ? }
? ? ? ? },
? ? ? ? $router: {
? ? ? ? ? ? push: jest.fn(),
? ? ? ? ? ? replace: jest.fn(),
? ? ? ? }
? ? }
})

jest-api

匹配器

使用不同匹配器可以測試輸入輸出的值是否符合預期。

  • toBe:判斷是否相等
  • toBeNull:判斷是否為null
  • toBeUndefined:判斷是否為undefined
  • toBeDefined:與上相反
  • toBeNaN:判斷是否為NaN
  • toBeTruthy:判斷是否為true
  • toBeFalsy:判斷是否為false
  • toContain:數(shù)組用,檢測是否包含
  • toHaveLength:數(shù)組用,檢測數(shù)組長度
  • toEqual:對象用,檢測是否相等
  • toThrow:異常匹配(沒用過)
describe('Foo', () => {
?? ?expect(2 + 2).toBe(4)
?? ?expect(null).toBeNull()
?? ?expect(undefined).toBeUndefined()
?? ?let a = 1;
?? ?expect(a).toBeDefined()
?? ?a = 'ada';
?? ?expect(a).toBeNaN()
?? ?a = true;
?? ?expect(a).toBeTruthy()
?? ?a = false;
?? ?expect(a).toBeFalsy()
?? ?a ?= [1,2,3];
?? ?expect(a).toContain(2)
?? ?expect(a).toHaveLength(3)
?? ?a = {a:1};
?? ?expect(a).toEqual({a:1})
})

mock函數(shù)

例如:在一個vue組件中,ajax請求、路由跳轉是常常用到的,但是在單測代碼中,我們并不能正確的知道他是否執(zhí)行并達到了預期的效果,這時就需要mock函數(shù)。在上文掛載選項中的mocks.$router就是一種mock函數(shù)的應用實例。

mock函數(shù)自然是要使用該函數(shù),下面是一些函數(shù)的常用匹配器

  • toBeCalledTimes:判斷函數(shù)被執(zhí)行的次數(shù)
  • toBeCalled:判斷函數(shù)是否被執(zhí)行
<template>
?? ?<div class="jest" @click="go"></div>
</template>
<script src="./script.js">
export default {
?? ?name:"Foo",
? ? methods:{
? ? ?? ?go(){
?? ??? ??? ?this.$router.push({path:"/a"})
?? ??? ?}
? ? }
}
</script>
import { shallowMount } from '@vue/test-utils'
import Foo from './Foo.vue'
const wrapper = shallowMount(Foo, {
? mocks: {
? ? ? ? $router: {
? ? ? ? ? ? push: jest.fn(),
? ? ? ? ? ? replace: jest.fn(),
? ? ? ? }
? ? }
})
wrapper.find(“jest").trigger("click");
expect(wrapper.vm.$router.push).toBeCalled();
wrapper.find(“jest").trigger("click");
expect(wrapper.vm.$router.push).toBeCalledTimes(2);

promise模擬

jest.mock('@root/api'); //模擬api請求函數(shù)
import {getList} from '@root/api';
const listJson = JSON.parse(require('fs').readFileSync('./mock/getList.json')); //引入mock好的json數(shù)據(jù)
getList.mockResolvedValue(Promise.resolve(listJson)); //模擬promise返回
getList().then(res => {
?? ?expect(res).toEqual(listJson);
})

為什么要使用單測

說了這么多,那為什么要使用單測呢。在看完上面的描述我想大家也是一頭郁悶,單測有用嗎?答案當然是有。下面舉個例子:

<template>
?? ?<div class="jest"></div>
</template>
<script src="./script.js">
import {getList} from '@root/api';
export default {
?? ?name:"Foo",
? ? created(){
? ? ?? ?getList()
? ? ?? ?.then(res => {
? ? ?? ??? ?this.initData(res)
? ? ?? ?})
? ? },
? ? methods:{
?? ??? ?initData(data){
?? ??? ??? ?data.name = '王大大';
?? ??? ?}
?? ?}
}
</script>
import { shallowMount } from '@vue/test-utils'
import Foo from './Foo.vue'
const wrapper = shallowMount(Foo)

這時候就會報錯data.name,因為data不一定有值。正確案例如下

<template>
?? ?<div class="jest"></div>
</template>
<script src="./script.js">
import {getList} from '@root/api';
export default {
?? ?name:"Foo",
? ? created(){
? ? ?? ?getList()
? ? ?? ?.then(res => {
? ? ?? ??? ?this.initData(res)
? ? ?? ?})
? ? },
? ? methods:{
?? ??? ?initData(data = {}){
?? ??? ??? ?data.name = '王大大';
?? ??? ?}
?? ?}
}
</script>

說白了就是讓你的代碼邏輯更符合預期結果。

總結

目前在vue中用到的一些基本知識都已經(jīng)總結完了,如果以后在工作中使用了新的api,時間充裕的情況下我會持續(xù)更新。以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • vue 2.0封裝model組件的方法

    vue 2.0封裝model組件的方法

    本篇文章主要介紹了vue 2.0封裝model組件的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • vue之帶參數(shù)跳轉打開新頁面、新窗口

    vue之帶參數(shù)跳轉打開新頁面、新窗口

    這篇文章主要介紹了vue之帶參數(shù)跳轉打開新頁面、新窗口方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 常見的5種Vue組件通信方式總結

    常見的5種Vue組件通信方式總結

    在?Vue.js?中,組件通信是開發(fā)過程中非常重要的一部分,它涉及到不同組件之間的數(shù)據(jù)傳遞和交互,本文將介紹如何實現(xiàn)父子組件之間的有效通信,并盤點了常見的5種Vue組件通信方式總結,需要的朋友可以參考下
    2024-03-03
  • vue使用driver.js完成頁面引導功能的示例詳解

    vue使用driver.js完成頁面引導功能的示例詳解

    在Vue中,driver.js通常是指用于實現(xiàn)用戶引導和教程功能的JavaScript庫,它可以幫助開發(fā)者在應用程序中創(chuàng)建交互式的引導和教程,以引導用戶了解應用程序的不同功能和界面,本文就簡單的給大家介紹一下vue如何使用driver.js完成頁面引導功能
    2023-08-08
  • vue3中實現(xiàn)組件通信的方法總結

    vue3中實現(xiàn)組件通信的方法總結

    在Vue3中,有多種方法可以實現(xiàn)組件之間的通信,本文就通過代碼示例給大家總結一些vue3實現(xiàn)組件通信的常用方法,需要的朋友可以參考下
    2023-06-06
  • vue3中使用vuex和vue-router的詳細步驟

    vue3中使用vuex和vue-router的詳細步驟

    這篇文章主要介紹了vue3中使用vuex和vue-router的步驟,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • vue自定義過濾器創(chuàng)建和使用方法詳解

    vue自定義過濾器創(chuàng)建和使用方法詳解

    這篇文章主要為大家詳細介紹了vue自定義過濾器創(chuàng)建和使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Vue+Django項目部署詳解

    Vue+Django項目部署詳解

    這篇文章主要介紹了Vue+Django項目部署詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • Vue的hover/click事件如何動態(tài)改變顏色和背景色

    Vue的hover/click事件如何動態(tài)改變顏色和背景色

    這篇文章主要介紹了Vue的hover/click事件如何動態(tài)改變顏色和背景色問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • vue增加強緩存和版本號的實現(xiàn)方法

    vue增加強緩存和版本號的實現(xiàn)方法

    這篇文章主要介紹了vue增加強緩存和版本號的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05

最新評論

浏阳市| 沽源县| 大田县| 罗定市| 科技| 壶关县| 建平县| 龙泉市| 荃湾区| 融水| 自治县| 汉寿县| 吉木萨尔县| 正安县| 永德县| 青田县| 肥西县| 镇康县| 龙泉市| 合肥市| 平定县| 宾阳县| 皮山县| 汪清县| 宝应县| 平邑县| 息烽县| 观塘区| 新津县| 西吉县| 乐山市| 澄江县| 沙洋县| 彰武县| 阳城县| 石门县| 桓仁| 庄浪县| 陇川县| 自贡市| 苗栗县|