真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Vue-Router如何進(jìn)行單元測(cè)試-創(chuàng)新互聯(lián)

本篇文章為大家展示了 Vue-Router如何進(jìn)行單元測(cè)試,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)鄱陽(yáng)免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千多家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

創(chuàng)建組件

我們會(huì)弄一個(gè)簡(jiǎn)單的 ,包含一個(gè)  /nested-child  路由。訪問 /nested-child  則渲染一個(gè)   組件。創(chuàng)建 App.vue  文件,并定義如下的最小化組件:



  同樣迷你:



現(xiàn)在定義一個(gè)路由:

import NestedRoute from "@/components/NestedRoute.vue"

export default [
 { path: "/nested-route", component: NestedRoute }
]

在真實(shí)的應(yīng)用中,一般會(huì)創(chuàng)建一個(gè) router.js  文件并導(dǎo)入定義好的路由,寫出來(lái)一般是這樣的:

import Vue from "vue"
import VueRouter from "vue-router"
import routes from "./routes.js"

Vue.use(VueRouter)

export default new VueRouter({ routes })

為避免調(diào)用 Vue.use(...)  污染測(cè)試的全局命名空間,我們將會(huì)在測(cè)試中創(chuàng)建基礎(chǔ)的路由;這讓我們能在單元測(cè)試期間更細(xì)粒度的控制應(yīng)用的狀態(tài)。

編寫測(cè)試

先看點(diǎn)代碼再說吧。我們來(lái)測(cè)試 App.vue,所以相應(yīng)的增加一個(gè)  App.spec.js:

import { shallowMount, mount, createLocalVue } from "@vue/test-utils"
import App from "@/App.vue"
import VueRouter from "vue-router"
import NestedRoute from "@/components/NestedRoute.vue"
import routes from "@/routes.js"

const localVue = createLocalVue()
localVue.use(VueRouter)

describe("App", () => {
 it("renders a child component via routing", () => {
  const router = new VueRouter({ routes })
  const wrapper = mount(App, { localVue, router })

  router.push("/nested-route")

  expect(wrapper.find(NestedRoute).exists()).toBe(true)
 })
})

照例,一開始先把各種模塊引入我們的測(cè)試;尤其是引入了應(yīng)用中所需的真實(shí)路由。這在某種程度上很理想 -- 若真實(shí)路由一旦掛了,單元測(cè)試就失敗,這樣我們就能在部署應(yīng)用之前修復(fù)這類問題。

可以在   測(cè)試中使用一個(gè)相同的 localVue,并將其聲明在第一個(gè)  describe  塊之外。而由于要為不同的路由做不同的測(cè)試,所以把 router  定義在 it  塊里。

另一個(gè)要注意的是這里用了 mount  而非 shallowMount。如果用了  shallowMount,則    就會(huì)被忽略,不管當(dāng)前路由是什么,渲染的其實(shí)都是一個(gè)無(wú)用的替身組件。

為使用了 mount 的大型渲染樹做些變通

使用 mount  在某些情況下很好,但有時(shí)卻是不理想的。比如,當(dāng)渲染整個(gè)   組件時(shí),正趕上渲染樹很大,包含了許多組件,一層層的組件又有自己的子組件。這么些個(gè)子組件都要觸發(fā)各種生命周期鉤子、發(fā)起 API 請(qǐng)求什么的。

如果你在用 Jest,其強(qiáng)大的 mock 系統(tǒng)為此提供了一個(gè)優(yōu)雅的解決方法??梢院?jiǎn)單的 mock 掉子組件,在本例中也就是 。使用了下面的寫法后,以上測(cè)試也將能通過:

jest.mock("@/components/NestedRoute.vue", () => ({
 name: "NestedRoute",
 render: h => h("div")
}))

使用 Mock Router

有時(shí)真實(shí)路由也不是必要的?,F(xiàn)在升級(jí)一下 ,讓其根據(jù)當(dāng)前 URL 的查詢字符串顯示一個(gè)用戶名。這次我們用 TDD 實(shí)現(xiàn)這個(gè)特性。以下是一個(gè)基礎(chǔ)測(cè)試,簡(jiǎn)單的渲染了組件并寫了一句斷言:

import { shallowMount } from "@vue/test-utils"
import NestedRoute from "@/components/NestedRoute.vue"
import routes from "@/routes.js"

describe("NestedRoute", () => {
 it("renders a username from query string", () => {
  const username = "alice"
  const wrapper = shallowMount(NestedRoute)

  expect(wrapper.find(".username").text()).toBe(username)
 })
})

然而我們并沒有

  ,所以一運(yùn)行測(cè)試就會(huì)報(bào)錯(cuò):

tests/unit/NestedRoute.spec.js
  NestedRoute
    ? renders a username from query string (25ms)

  ● NestedRoute ? renders a username from query string

    [vue-test-utils]: find did not return .username, cannot call text() on empty Wrapper

來(lái)更新一下

現(xiàn)在報(bào)錯(cuò)變?yōu)榱耍?/p>

tests/unit/NestedRoute.spec.js
  NestedRoute
    ? renders a username from query string (17ms)

  ● NestedRoute ? renders a username from query string

    TypeError: Cannot read property 'params' of undefined

這是因?yàn)?$route  并不存在。 我們當(dāng)然可以用一個(gè)真正的路由,但在這樣的情況下只用一個(gè) mocks  加載選項(xiàng)會(huì)更容易些:

it("renders a username from query string", () => {
 const username = "alice"
 const wrapper = shallowMount(NestedRoute, {
  mocks: {
   $route: {
    params: { username }
   }
  }
 })

 expect(wrapper.find(".username").text()).toBe(username)
})

這樣測(cè)試就能通過了。在本例中,我們沒有做任何的導(dǎo)航或是和路由的實(shí)現(xiàn)相關(guān)的任何其他東西,所以 mocks  就挺好。我們并不真的關(guān)心 username  是從查詢字符串中怎么來(lái)的,只要它出現(xiàn)就好。

測(cè)試路由鉤子的策略

Vue Router 提供了多種類型的路由鉤子, 稱為 “navigation guards”。舉兩個(gè)例子如:

  • 全局 guards (router.beforeEach)。在 router 實(shí)例上聲明

  • 組件內(nèi) guards,比如 beforeRouteEnter。在組件中聲明

要確保這些運(yùn)作正常,一般是集成測(cè)試的工作,因?yàn)樾枰粋€(gè)使用者從一個(gè)理由導(dǎo)航到另一個(gè)。但也可以用單元測(cè)試檢驗(yàn)導(dǎo)航 guards 中調(diào)用的函數(shù)是否正常工作,并更快的獲得潛在錯(cuò)誤的反饋。這里列出一些如何從導(dǎo)航 guards 中解耦邏輯的策略,以及為此編寫的單元測(cè)試。

全局 guards

比方說當(dāng)路由中包含 shouldBustCache  元數(shù)據(jù)的情況下,有那么一個(gè) bustCache  函數(shù)就應(yīng)該被調(diào)用。路由可能長(zhǎng)這樣:

//routes.js

import NestedRoute from "@/components/NestedRoute.vue"

export default [
 {
  path: "/nested-route",
  component: NestedRoute,
  meta: {
   shouldBustCache: true
  }
 }
]

之所以使用 shouldBustCache  元數(shù)據(jù),是為了讓緩存無(wú)效,從而確保用戶不會(huì)取得舊數(shù)據(jù)。一種可能的實(shí)現(xiàn)如下:

//router.js

import Vue from "vue"
import VueRouter from "vue-router"
import routes from "./routes.js"
import { bustCache } from "./bust-cache.js"

Vue.use(VueRouter)

const router = new VueRouter({ routes })

router.beforeEach((to, from, next) => {
 if (to.matched.some(record => record.meta.shouldBustCache)) {
  bustCache()
 }
 next()
})

export default router

在單元測(cè)試中,你可能想導(dǎo)入 router 實(shí)例,并試圖通過 router.beforeHooks[0]()  的寫法調(diào)用 beforeEach;但這將拋出一個(gè)關(guān)于  next  的錯(cuò)誤 -- 因?yàn)闆]法傳入正確的參數(shù)。針對(duì)這個(gè)問題,一種策略是在將 beforeEach  導(dǎo)航鉤子耦合到路由中之前,解耦并單獨(dú)導(dǎo)出它。做法是這樣的:

//router.js

export function beforeEach((to, from, next) {
 if (to.matched.some(record => record.meta.shouldBustCache)) {
  bustCache()
 }
 next()
}

router.beforeEach((to, from, next) => beforeEach(to, from, next))

export default router

再寫測(cè)試就容易了,雖然寫起來(lái)有點(diǎn)長(zhǎng):

import { beforeEach } from "@/router.js"
import mockModule from "@/bust-cache.js"

jest.mock("@/bust-cache.js", () => ({ bustCache: jest.fn() }))

describe("beforeEach", () => {
 afterEach(() => {
  mockModule.bustCache.mockClear()
 })

 it("busts the cache when going to /user", () => {
  const to = {
   matched: [{ meta: { shouldBustCache: true } }]
  }
  const next = jest.fn()

  beforeEach(to, undefined, next)

  expect(mockModule.bustCache).toHaveBeenCalled()
  expect(next).toHaveBeenCalled()
 })

 it("busts the cache when going to /user", () => {
  const to = {
   matched: [{ meta: { shouldBustCache: false } }]
  }
  const next = jest.fn()

  beforeEach(to, undefined, next)

  expect(mockModule.bustCache).not.toHaveBeenCalled()
  expect(next).toHaveBeenCalled()
 })
})

最主要的有趣之處在于,我們借助 jest.mock,mock 掉了整個(gè)模塊,并用 afterEach  鉤子將其復(fù)原。通過將 beforeEach  導(dǎo)出為一個(gè)已結(jié)耦的、普通的 Javascript 函數(shù),從而讓其在測(cè)試中不成問題。

為了確定 hook 真的調(diào)用了 bustCache  并且顯示了最新的數(shù)據(jù),可以使用一個(gè)諸如 Cypress.io 的端到端測(cè)試工具,它也在應(yīng)用腳手架 vue-cli  的選項(xiàng)中提供了。

組件 guards

一旦將組件 guards 視為已結(jié)耦的、普通的 Javascript 函數(shù),則它們也是易于測(cè)試的。假設(shè)我們?yōu)?  添加了一個(gè) beforeRouteLeave  hook:

//NestedRoute.vue

對(duì)在全局 guard 中的方法照貓畫虎就可以測(cè)試它了:

// ...
import NestedRoute from "@/compoents/NestedRoute.vue"
import mockModule from "@/bust-cache.js"

jest.mock("@/bust-cache.js", () => ({ bustCache: jest.fn() }))

it("calls bustCache and next when leaving the route", () => {
 const next = jest.fn()
 NestedRoute.beforeRouteLeave(undefined, undefined, next)

 expect(mockModule.bustCache).toHaveBeenCalled()
 expect(next).toHaveBeenCalled()
})

Vue的優(yōu)點(diǎn)

Vue具體輕量級(jí)框架、簡(jiǎn)單易學(xué)、雙向數(shù)據(jù)綁定、組件化、數(shù)據(jù)和結(jié)構(gòu)的分離、虛擬DOM、運(yùn)行速度快等優(yōu)勢(shì),Vue中頁(yè)面使用的是局部刷新,不用每次跳轉(zhuǎn)頁(yè)面都要請(qǐng)求所有數(shù)據(jù)和dom,可以大大提升訪問速度和用戶體驗(yàn)。

上述內(nèi)容就是 Vue-Router如何進(jìn)行單元測(cè)試,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


網(wǎng)頁(yè)題目:Vue-Router如何進(jìn)行單元測(cè)試-創(chuàng)新互聯(lián)
URL分享:http://weahome.cn/article/dihoii.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部