亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

教你如何編寫Vue.js的單元測試的方法

2019-11-19 12:41:07
字體:
來源:轉載
供稿:網友

Vue.js是一個JavaScript框架,可用于構建Web應用程序的前端框架。特別是在創建復雜功能時,對于每個項目,有必要在我們的應用程序中查看所有內容,并檢查它是否符合預期。然而,對于大型項目,每次新的更新后,檢查每個功能將變得很麻煩。因此,我們可以創建可以一直運行的自動化測試,并保證我們的代碼可以正常運行。在本文中,我們將為VueJS創建一些簡單的單元測試。

要進行測試,我們將先制作一個基本的待辦事項列表組件。我們將測試該列表是否正確顯示,并且用戶可以將新項目添加到待辦事項列表中。希望在本教程結束之前,您可以編寫測試,檢查您的組件輸出給用戶,以及通過與HTML進行交互來模擬用戶操作(例如通過單擊按鈕)。

本文中的所有代碼可以在 Github 下載。

搭建環境

搭建JavaScript項目可能是一個復雜的過程。有那么多庫需要選擇,所有這些庫的目的都略有不同。幸運的是,對于VueJS,我們有vue-cli,它為我們設定了一切!您需要首先安裝npm,然后可以運行以下命令:

npm install -g vue-clivue init webpack project-name

在這個階段,你會被提示幾個問題。大多數都可以直接繼續,您可以選擇默認選項,唯一的要求是您回答YES以包括vue-router和YES來設置Karma和Mocha的單元測試。然后安裝依賴項:

cd project-namenpm install

這個最終命令將啟動您的瀏覽器并打開localhost運行您的應用程序:

npm run dev

下面是對vue-cli為我們設置的一些關鍵依賴關系(非常重要)的簡要概述,包括為我自己的項目安裝的版本。

依賴

Webpack (v2.3) 是一個捆綁器,它結合了各種JavaScript,CSS,HTML(和其他)文件,使他們可以隨時由客戶端處理。
Babel (v6.22) 是ECMAScript 6到ECMAScript 5的編譯器。這些是不同的JavaScript標準,目前的瀏覽器不能解析所有的ECMAScript 6,因此需要進行轉換。

測試依賴關系

Karma (v1.4) 是一個測試運行器,它運行一個Web服務器,其中包含項目的應用程序代碼,并對其執行測試。

Mocha (v3.2) 是JavaScript的測試框架。
Chai (v3.5) 是可以與Mocha一起使用的斷言庫。

在您的項目中,您應該能找到以下文件夾:build,config,node_modules,src,static和test。對本文來說,重要的是src,它將保存我們的應用程序代碼并進行test。

我的第一個測試

一個好的開始需要去做一些基本工作。我們將從創建簡單列表組件開始。在src/components文件夾中創建一個名為List.vue的新文件,并將以下代碼放在里面:

<template> <div>  <h1>My To Do List</h1>  </br>  <!--displays list -->  <ul>   <li v-for="item in listItems">{{ item }}</li>  </ul> </div></template> <script>export default { name: 'list', data () {  return {   listItems: ['buy food', 'play games', 'sleep'],  } }}</script>

在組件中,列表項存儲在組件數據中的數組(listItems)中。然后可以在模板中訪問該數據,并在foreach循環中循環(v-for),并顯示在頁面上。

為了使我們的列表看起來更有趣,我們可以創建一個新的路徑來顯示我們的組件。進入src/router/index.js并添加路由,你的代碼應該是這樣的:

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  }, ]})

現在,如果您導航到localhost:8080/#/to-do,您將在瀏覽器中看到您的列表效果!

首先我們要測試數據是否正確顯示。在 test/unit/specs 下創建一個新的文件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 })})

在這個文件中,我們描述List.vue組件,我們有一個單獨的空測試,它將檢查它(組件)是否從列表中顯示項目。這是Mocha測試的基本文件結構。

在我們的測試中,我們首先需要設置Vue組件。復制下面的代碼,并將其放在注釋“our test goes here”的位置:

// build componentconst Constructor = Vue.extend(List);const ListComponent = new Constructor().$mount();

我們擴展Vue然后安裝我們的組件。安裝組件很重要,因為這是在我們的模板中呈現HTML。這實際上意味著HTML被構建,并且我們的模板中的變量(例如{{item}})被填滿數據,使得我們可以訪問HTML(通過$el)。

隨著我們的組件準備好,我們可以寫第一個斷言。在這個例子中,我們使用了'expect'風格,由Chai斷言庫提供,以及'should'和'assert'。 安裝組件后放置以下代碼:

// assert that component text contains items from the listexpect(ListComponent.$el.textContent).to.contain('play games');

如上所述,我們可以使用ListComponent.$el獲取組件的HTML,并且使用ListComponent.$el.textContent只訪問內部HTML(即文本)。斷言是檢查文本是否包含在組件數據中設置的列表項之一。

為了檢查一切都能正常工作,我們可以運行測試!使用vue-cli項目,我們可以簡單地輸入npm run unit,這是一個別名 cross-env BABEL_ENV = test karma start test/unit/karma.conf.js --single-run。

npm run unit

如果所有的測試都已經通過,它將顯示綠色,并顯示成功測試和代碼覆蓋率報告的列表,讓您知道在測試期間執行的應用程序代碼的百分比。

模擬用戶輸入

這是一個很好的開始,但是很少有應用程序只會顯示數據。我們要添加的下一個功能是讓用戶能夠在其列表中添加新項目。為此,我們需要一個輸入框,用戶可以在其中鍵入新項目,并在按鈕上添加項目到列表中。這是List.vue的更新版本:

<template> <div>  <h1>My To Do List</h1>  </br>  <input v-model="newItem" >  <button @click="addItemToList">Add</button>  <!-- displays list -->   <ul>   <li v-for="item in listItems">{{ item }}</li>  </ul> </div></template> <script>export default { name: 'test', data () {  return {   listItems: ['buy food', 'play games', 'sleep'],   newItem: ''  } }, methods: {   addItemToList() {    this.listItems.push(this.newItem);    this.newItem = '';   } }}</script>

使用v-model,輸入框的值綁定到存儲在組件數據中的newItem變量。當單擊按鈕時,將執行addItemToList函數,將newItem添加到列表數組中,并清除newItem,以便可以將更多的內容添加到列表中。

要開始測試此功能,請在List.spec.js中創建一個新的空測試,并添加測試代碼:

it('adds a new item to list on click', () => {  // our test goes here})

首先我們要構建我們的組件,并模擬一個用戶在輸入框中輸入的內容。由于VueJS將輸入框的值綁定到newItem變量,所以我們可以簡單地將我們的值設置為newItem。

// build componentconst Constructor = Vue.extend(List);const ListComponent = new Constructor().$mount(); // set value of new itemListComponent.newItem = 'brush my teeth';

接下來我們需要點擊按鈕。我們必須在HTML中找到這個按鈕,它可以使用$el。只有這一次,我們才可以使用querySelector來查找實際的元素。可以使用它的類(.buttonClass),其id(#buttonId)或元素的名稱(button)來找到一個元素。

// find buttonconst button = ListComponent.$el.querySelector('button');

為了模擬一個點擊,我們需要將按鈕傳遞給一個新的事件對象。在測試環境中,List組件不會監聽任何事件,因此我們需要手動運行監視器。

// simulate click eventconst clickEvent = new window.Event('click');button.dispatchEvent(clickEvent);ListComponent._watcher.run();

最后,我們需要檢查newItem是否顯示,我們已經知道如何從第一個測試中完成!我們可能還想檢查newItem是否存儲在列表數組中。

//assert list contains new itemexpect(ListComponent.$el.textContent).to.contain('brush my teeth');expect(ListComponent.listItems).to.contain('brush my teeth');

以下是完整的測試文件:

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'); })})

現在我們可以再次運行我們的測試,應該會顯示綠色!

希望這段代碼對你來說能夠很清楚,但是它不是特別容易理解,特別是對于第一次進行VueJS測試的人來說。有一個VueJS實用程序庫,其中包含了一些更復雜的外觀代碼。要使用它,我們可以轉到我們的項目根目錄并運行以下命令:

npm install avoriaz

現在我們可以隱藏mount()之后的Vue組件的設置,并且為了單擊按鈕,我們需要的是兩行代碼:find()該按鈕和dispatch() )點擊事件。

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'); })})

總結

我個人認為寫作測試對于我的正常工作流程至關重要,但是使用JavaScript,特別是VueJS,我開始碰到一些麻煩。希望本教程將幫助任何與我一樣遇到麻煩的人!

本文中的所有代碼可以在 Github 下載。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日本另类| 日本韩国在线不卡| 国产91网红主播在线观看| 亚洲有声小说3d| 亚洲一区美女视频在线观看免费| 亚洲欧美在线看| 精品久久久久久久久久ntr影视| 亚洲一区中文字幕| 91精品久久久久久久| 欧美精品免费播放| 国产999在线观看| 在线观看日韩专区| 一区二区三区天堂av| 欧美成人网在线| 欧美激情a∨在线视频播放| 久久国产精品99国产精| 日韩av免费看| 尤物tv国产一区| 国产精品扒开腿做爽爽爽视频| 日本韩国欧美精品大片卡二| 久久久精品久久久久| 亚洲天堂开心观看| 在线国产精品播放| 亚洲精品电影网在线观看| 日韩精品极品在线观看| 国产丝袜视频一区| 欧美午夜丰满在线18影院| 欧美午夜宅男影院在线观看| 最新国产成人av网站网址麻豆| 国产精品视频一区国模私拍| 97在线观看免费高清| 日韩在线观看免费高清| 欧美交受高潮1| 欧美大片va欧美在线播放| 久久久国产一区二区三区| 91欧美激情另类亚洲| 午夜精品一区二区三区在线视频| 欧美大尺度激情区在线播放| 久久久久久久色| 日韩成人xxxx| 91精品国产综合久久香蕉| 欧美视频中文在线看| 亚洲成人av片| 日韩美女视频中文字幕| 欧美裸体xxxxx| 日韩欧美高清视频| 欧美床上激情在线观看| 亚洲成色www8888| 欧美电影免费在线观看| 国产精品极品美女粉嫩高清在线| 麻豆国产精品va在线观看不卡| 97国产真实伦对白精彩视频8| 国产精品亚洲综合天堂夜夜| 欧美一级视频一区二区| 成年人精品视频| 国产热re99久久6国产精品| 国产成人精品综合久久久| 国产一区二区免费| 久久久综合av| 亚洲视频电影图片偷拍一区| 黑人巨大精品欧美一区免费视频| 欧美自拍大量在线观看| 97精品国产97久久久久久免费| 一区二区三区视频观看| 尤物99国产成人精品视频| 久久久国产精彩视频美女艺术照福利| 成人午夜在线视频一区| 精品一区二区三区电影| 视频一区视频二区国产精品| 欧美成人免费小视频| 亚洲一区999| 国产在线精品一区免费香蕉| 红桃视频成人在线观看| 国产成人精品优优av| 国产有码一区二区| 精品视频—区二区三区免费| 国产精品午夜视频| 97超级碰在线看视频免费在线看| 日韩久久免费电影| 国产精品青草久久久久福利99| 国产精品日日做人人爱| 伊人伊成久久人综合网站| 色狠狠av一区二区三区香蕉蜜桃| 日韩亚洲国产中文字幕| 成人h片在线播放免费网站| 色哟哟网站入口亚洲精品| 亚洲专区国产精品| 日韩精品在线视频观看| 久久国产一区二区三区| 亚洲女人被黑人巨大进入| 国产一区二区成人| 日本成人黄色片| 久久伊人免费视频| 操日韩av在线电影| 亚洲韩国欧洲国产日产av| 久久久久久免费精品| 欧美日韩国产成人高清视频| 精品色蜜蜜精品视频在线观看| 正在播放亚洲1区| 超在线视频97| 成人网址在线观看| 91av网站在线播放| 色七七影院综合| 国产精品自产拍在线观| 国产欧美一区二区三区视频| 日韩精品视频免费在线观看| 亚洲免费视频在线观看| 欧亚精品在线观看| 国产精品久久久久久久电影| 国产精品永久免费在线| 久久久精品久久久| 欧美性jizz18性欧美| 国产福利成人在线| 国产精品久久一区| 亚洲激情视频在线观看| 大桥未久av一区二区三区| 中文字幕亚洲二区| 久久深夜福利免费观看| 国产日韩欧美中文在线播放| 欧美成人三级视频网站| 久久的精品视频| 欧美视频在线观看免费| 欧美激情在线一区| 九九热最新视频//这里只有精品| 欧美成人精品一区| 亚洲精品黄网在线观看| 亚洲欧美日韩精品久久| 国产精品久久久久久久久久99| 成人444kkkk在线观看| 亚洲品质视频自拍网| 久久影院模特热| 亚洲人成网7777777国产| 国产一区二区香蕉| 日韩成人av网| 美女少妇精品视频| 91精品国产综合久久香蕉| 日韩电影免费在线观看| 最近2019中文字幕在线高清| 久久久久久亚洲| 久久久女女女女999久久| 精品欧美aⅴ在线网站| 永久免费毛片在线播放不卡| 国产精品美女在线| 国产成人jvid在线播放| 69久久夜色精品国产7777| 久久久久一本一区二区青青蜜月| 久久资源免费视频| 午夜精品福利电影| 欧美成人黑人xx视频免费观看| 国产精品jvid在线观看蜜臀| 国产99久久久欧美黑人| 亚洲精品视频在线观看视频| 欧美性感美女h网站在线观看免费| 久热在线中文字幕色999舞| 国产精品久久久久久久久久东京| 国产a∨精品一区二区三区不卡| 日本精品久久电影| 久久精品91久久久久久再现| 久久久久久久999| 欧美激情视频在线| 亚洲欧洲一区二区三区在线观看| 欧美猛交免费看| 日韩欧美亚洲范冰冰与中字| 国产亚洲精品va在线观看|