摘要:在這個教程中,我們將創(chuàng)建一個簡單的項(xiàng)目,并為其寫一個簡單的單元測試。希望你讀這些代碼的時候思路能夠清晰,不過它對于剛剛開始接觸單元測試的人來說可讀性并不是很高。總結(jié)在日常工作以及開發(fā)中,尤其是項(xiàng)目,測試是非常重要的。
譯者:明非
鏈接:https://fanmingfei.com/posts/A_Vue_Unit_Text_Tutorial.html
原文:https://scotch.io/amp/tutorials/how-to-write-a-unit-test-for-vuejs?from=timeline&isappinstalled=0
眾所周知,Vue.js 是一個非常牛逼的 JavaScript 框架,對于創(chuàng)建復(fù)雜功能的前端項(xiàng)目是非常有用的。不管是什么項(xiàng)目,檢查應(yīng)用是否正常工作,運(yùn)行是否為預(yù)期,是尤為重要的。然而,為了保證業(yè)務(wù)正常運(yùn)行,我們的項(xiàng)目,每做一次更新,都要對所有功能做一次回歸測試,隨著項(xiàng)目的增大,重復(fù)的測試工作越來越多,越來越乏味,手工測試將變成一個惡心的事情。正因如此,自動化測試誕生了,它可以隨時監(jiān)測我們的代碼是否正常工作,運(yùn)行結(jié)果是否符合預(yù)期。在這個教程中,我們將創(chuàng)建一個簡單的VueJS項(xiàng)目,并為其寫一個簡單的單元測試。
我們創(chuàng)建一個基本的 to-do list 組件進(jìn)行測試。我們將要測試的是,列表展示是否正確,用戶是否可以正常添加到 to-do list。通過這個教程,你將學(xué)會如何去為你的組件寫一個測試,測試包括HTML展示是否正確以及用戶的操作是否能正常進(jìn)行。
這個git庫是這篇文章的所有代碼。
創(chuàng)建項(xiàng)目創(chuàng)建 JavaScript 項(xiàng)目可能是一個復(fù)雜的過程。琳瑯滿目的依賴庫供我們選擇。不過還好,我們可以使用vue-cli來創(chuàng)建VueJS項(xiàng)目,它幫我們包辦一切。運(yùn)行 npm install 來安裝依賴:
npm install -g vue-cli
vue init webpack project-name
在這個過程中,你可能會遇到幾個提示。大多數(shù)提示比較簡單易懂,你可以直接選擇默認(rèn)選項(xiàng)。需要注意的是,我們需要是否安裝 vue-router、Karma、Mocha的提示后輸入YES來引入這些工具。然后開始安裝依賴:
cd project-name
npm install
接下來我們執(zhí)行下面的命令,這個命令將會在本地運(yùn)行你的應(yīng)用并在瀏覽器中打開。
npm run dev
如果你的網(wǎng)絡(luò)好的話,一會就裝好了。
依賴Webpack (2.3) 是一個打包器,它可以合并打包JavaScript,CSS,HTML文件,并且提供給應(yīng)用運(yùn)行。Bable (v6.22) 是一個編譯器,用來把ES6編譯成ES5。目前有很多 JavaScript 標(biāo)準(zhǔn)在許多瀏覽器中還沒有被支持,所以需要將ES6轉(zhuǎn)成ES。
測試依賴Karma (v1.4) 是一個運(yùn)行時,它產(chǎn)生一個 Web 服務(wù)環(huán)境來運(yùn)行項(xiàng)目代碼,并且執(zhí)行測試。Mocha (v3.2) 是一個 JavaScript 測試框架。Chai (v3.5) 是一個 Mocha 可以使用的斷言庫。
在你的項(xiàng)目中,你可以找到下面這些目錄:build、config、node_modules、src、static 和 test。對于本教程來說最重要的是src,它包括我們應(yīng)用的代碼,用來測試。
第一次測試從最基本的開始去做一般都沒錯。我們將從創(chuàng)建簡單的列表組件開始。在 src/components 里創(chuàng)建一個新文件叫做 List.vue 并且將下面代碼寫進(jìn)去。
My To Do List
- {{ item }}
在這個組件中,列表項(xiàng)被儲存在數(shù)組(listItems)里面。數(shù)據(jù)被傳遞到模板,然后被遍歷(v-for),然后展現(xiàn)在頁面上。
當(dāng)然,我們需要看到剛剛創(chuàng)建的列表,我們可以創(chuàng)建一個新的路由來展示這個組件。在src/router/index.js中創(chuàng)建一個路由,添加完了代碼應(yīng)該是下面這樣的:
import Vue from "vue" import Router from "vue-router" import Hello from "@/components/Hello" import List from "@/components/List" Vue.use(Router) export default new Router({ routes: [ { path: "/", name: "Hello", component: Hello }, { path: "/to-do", name: "ToDo", component: List }, ] })
現(xiàn)在,訪問localhost:8080/#/to-do,可以看到我們做的應(yīng)用。
首先,我們要測試的是數(shù)據(jù)的正確性。在test/unit/specs目錄下創(chuàng)建一個List.spec.js,并且寫入下面的代碼:
import List from "@/components/List"; import Vue from "vue"; describe("List.vue", () => { it("displays items from the list", () => { // our test goes here }) })
在這個文件中,我們_describing_了List.vue組件,并且我們創(chuàng)建了一個空的測試,他將要檢查這個組件的列表展示。這是一個基本的 Mocha 測試文件。
我們首先要安裝我們的Vue組件。復(fù)制下面代碼放在測試文件的"our test goes here"下面:
// build component const Constructor = Vue.extend(List); const ListComponent = new Constructor().$mount();
我們繼承了Vue組件并且安裝這個組件。安裝組件很重要,只有這樣我們才能將通過模板來渲染HTML。也就是說,HTML已經(jīng)被創(chuàng)建,并且我們模板中的變量(比如 item)已經(jīng)被填充內(nèi)容,這樣我們就可以獲取HTML了(使用$el)。
我們的組件準(zhǔn)備好了,我們可以寫第一個斷言。在這個例子中,我們使用Chai 斷言庫提供的 "expect" 模式,還有 "should" 和 "assert"模式。將下面的代碼放到,啟動組件的后面。
// assert that component text contains items from the list expect(ListComponent.$el.textContent).to.contain("play games");
之前提到過,我們可以使用ListComponent.$el來獲取組件的HTML,如果想去獲取HTML內(nèi)的內(nèi)容(比如 文本),我們可以使用ListComponent.$el.textContent。這個斷言用來檢查HTML列表中的文本是否和組件的data里的數(shù)據(jù)列表吻合。
為了檢查所有的事情都符合我們的預(yù)期,我們可以運(yùn)行測試!通過 vue-cli 創(chuàng)建的項(xiàng)目,我們可以簡單的使用npm run unit來運(yùn)行cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run。
npm run unit
如果測試都通過了,將會有一個綠色的列表來顯示測試報告,讓你了解測試都覆蓋了哪些代碼。
模擬用戶輸入雖然前面的功能贊贊噠,但沒有多少應(yīng)用只是用來展示數(shù)據(jù)。下一步我們要做到是添加新的項(xiàng)目到to-do list中??催@里,我們創(chuàng)建了一個input框來輸入內(nèi)容,然后創(chuàng)建一個button用來提交內(nèi)容。下面是更新后的 List.vue:
My To Do List
- {{ item }}
使用v-model,輸入框里面的內(nèi)容將和newItem進(jìn)行雙向綁定。當(dāng)按鈕被點(diǎn)擊后,執(zhí)行addItemToList,將newItem添加到to-do list數(shù)組里面,并且清空newItem里面的內(nèi)容,新的項(xiàng)目將會被添加到列表中。
可以為新功能寫測試文件了,創(chuàng)建List.spec.js,并且添加以下測試代碼。
it("adds a new item to list on click", () => { // our test goes here })
第一步,我們需要創(chuàng)建我們的組件,并且模擬一個用戶在輸入框的輸入行為。因?yàn)?VueJs 將輸入框和 newItem 變量進(jìn)行了綁定,我們可以給newItem設(shè)置內(nèi)容。
// build component const Constructor = Vue.extend(List); const ListComponent = new Constructor().$mount(); // set value of new item ListComponent.newItem = "brush my teeth";
下一步,我們需要點(diǎn)擊按鈕。我們需要在HTML中找到按鈕,在$el中即可找到。這是,我們可以使用querySelector,像選擇真是元素一樣選擇這個按鈕。也可以使用class(.buttonClass)、ID(#buttonID)或者標(biāo)簽名(button)來選擇。
// find button const button = ListComponent.$el.querySelector("button");
為了模擬點(diǎn)擊,我們需要給按鈕一個新的事件對象。在測試環(huán)境中,List組件不會監(jiān)聽任何事件,因此我們需要手動運(yùn)行watcher。
// simulate click event const clickEvent = new window.Event("click"); button.dispatchEvent(clickEvent); ListComponent._watcher.run();
最后,我們需要檢查我們添加的新項(xiàng)目是否顯示在HTML中,這個在前面已經(jīng)介紹過。我們也需要檢查newItem是否被存儲在了數(shù)組里面。
//assert list contains new item expect(ListComponent.$el.textContent).to.contain("brush my teeth"); expect(ListComponent.listItems).to.contain("brush my teeth");
下面是整個測試文件的內(nèi)容:
import List from "@/components/List"; import Vue from "vue"; describe("List.vue", () => { it("displays items from the list", () => { const Constructor = Vue.extend(List); const ListComponent = new Constructor().$mount(); expect(ListComponent.$el.textContent).to.contain("play games"); }) it("adds a new item to list on click", () => { // build component const Constructor = Vue.extend(List); const ListComponent = new Constructor().$mount(); // set input value ListComponent.newItem = "brush my teeth"; // simulate click event const button = ListComponent.$el.querySelector("button"); const clickEvent = new window.Event("click"); button.dispatchEvent(clickEvent); ListComponent._watcher.run(); // assert list contains new item expect(ListComponent.$el.textContent).to.contain("brush my teeth"); expect(ListComponent.listItems).to.contain("brush my teeth"); }) })
現(xiàn)在跑一次這個測試,應(yīng)該全是綠色的。
希望你讀這些代碼的時候思路能夠清晰,不過它對于剛剛開始接觸VueJs單元測試的人來說可讀性并不是很高。有一個VueJS實(shí)用程序庫,它將一些復(fù)雜的代碼進(jìn)行了封裝。如果想使用它,可以在項(xiàng)目的根目錄下輸入以下命令安裝。
npm install avoriaz
下面這個測試實(shí)際上和上面測試相同,只不過寫法上有些不同。我們使用了mount()法來安裝Vue組件,使用find()獲取按鈕,使用dispatch()來觸發(fā)點(diǎn)擊。
import { mount } from "avoriaz"; import List from "@/components/List"; import Vue from "vue"; describe("List.vue", () => { // previous tests .. it("adds new item to list on click with avoriaz", () => { // build component const ListComponent = mount(List); // set input value ListComponent.setData({ newItem: "brush my teeth", }); // simulate click event const button = ListComponent.find("button")[0]; button.dispatch("click"); // assert list contains new item expect(ListComponent.text()).to.contain("brush my teeth"); expect(ListComponent.data().listItems).to.contain("brush my teeth"); }) })總結(jié)
在日常工作以及JavaScript開發(fā)中,尤其是VueJS項(xiàng)目,測試是非常重要的。因?yàn)閯傞_始接觸測試的時候,我遇到了一些問題,所以總結(jié)出一篇文章供大家參考。希望這篇文章能夠幫到所有像我一樣的人。
這個git庫是這次教程所有的代碼。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/84100.html
摘要:前端日報精選開發(fā)常見問題集錦前端碼農(nóng)的自我修養(yǎng)虛擬內(nèi)部是如何工作的譯知乎專欄并不慢,只是你使用姿勢不對一份優(yōu)化指南掘金老司機(jī)帶你秒懂內(nèi)存管理第一部中文免費(fèi)公開課前端面試的大關(guān)鍵點(diǎn),你到了嗎知乎專欄高效開發(fā)與設(shè)計(jì)姐的圖片二三 2017-07-19 前端日報 精選 VueJS 開發(fā)常見問題集錦 - 前端碼農(nóng)的自我修養(yǎng) - SegmentFault虛擬 DOM 內(nèi)部是如何工作的?[譯]Hig...
摘要:如何為你的項(xiàng)目添加配置如何為你的項(xiàng)目添加配置現(xiàn)在已經(jīng)是年了,網(wǎng)上許多教程和分享帖都已經(jīng)過期,照著他們的步驟來會踩一些坑,如已經(jīng)不再維護(hù),以及之后文件只剩下部分等。如有疑問或授權(quán)協(xié)商請與我聯(lián)系。如何為你的 Vue 項(xiàng)目添加配置 Stylelint 現(xiàn)在已經(jīng)是 9102 年了,網(wǎng)上許多教程和分享帖都已經(jīng)過期,照著他們的步驟來會踩一些坑,如 stylelint-processor-html 已經(jīng)不...
摘要:前端日報精選常用實(shí)例的實(shí)現(xiàn)與封裝實(shí)現(xiàn)一個構(gòu)建基于的可擴(kuò)展應(yīng)用規(guī)范翻譯從到中文開源中國兩級緩存實(shí)踐掘金中基于的自動實(shí)體類構(gòu)建與接口文檔生成某熊的全棧之路繼承總結(jié)教程中的五種組件形式掘金再說的問題前端開發(fā)前端每周清單第期正式 2017-07-18 前端日報 精選 javascript常用實(shí)例的實(shí)現(xiàn)與封裝實(shí)現(xiàn)一個 SwiperRekit 2.0 構(gòu)建基于React+Redux+React-r...
摘要:然而,這些模板并不限制你自己對于使用的架構(gòu)組織和選擇類庫。目前可用的模板包括全功能的,包括熱加載,靜態(tài)檢測,單元測試一個簡易的,以便于快速開始。 最近, 尤大在和人對噴的時候,悄然放出了一個大招,于是為了追趕他的步伐,趕緊試驗(yàn)了下,并且把原文給大家翻譯下。 原文地址:Announcing vue-cli 譯文源地址: Vuejs自己的構(gòu)建工具 先上原文翻譯: 最近有很多大量關(guān)于Reac...
摘要:正在失業(yè)中的課多周刊第期我們的微信公眾號,更多精彩內(nèi)容皆在微信公眾號,歡迎關(guān)注。若有幫助,請把課多周刊推薦給你的朋友,你的支持是我們最大的動力。是一種禍害譯本文淺談了在中關(guān)于的不好之處。淺談超時一運(yùn)維的排查方式。 正在失業(yè)中的《課多周刊》(第3期) 我們的微信公眾號:fed-talk,更多精彩內(nèi)容皆在微信公眾號,歡迎關(guān)注。 若有幫助,請把 課多周刊 推薦給你的朋友,你的支持是我們最大的...
閱讀 3702·2021-11-11 10:58
閱讀 2486·2021-09-22 15:43
閱讀 2875·2019-08-30 15:44
閱讀 2196·2019-08-30 13:08
閱讀 1827·2019-08-29 17:28
閱讀 893·2019-08-29 10:54
閱讀 683·2019-08-26 11:46
閱讀 3512·2019-08-26 11:43