4.vue造輪子-自動化測試

使用 Karma + Mocha做單元測試使用 Karma + Mocha做單元測試使用 Karma + Mocha做單元測試

  1. Karma([?kɑrm?] 卡瑪)是一個測試運行器继低,它可以呼起瀏覽器,加載測試腳本童本,然后運行測試用例
  2. Mocha([?mo?k?] 摩卡)是一個單元測試框架/庫哗总,它可以用來寫測試用例
  3. Sinon(西農(nóng))是一個 spy / stub / mock 庫几颜,用以輔助測試(使用后才能理解)

步驟

  1. 安裝各種工具
npm i -D karma karma-chrome-launcher karma-mocha karma-sinon-chai mocha sinon sinon-chai karma-chai karma-chai-spies
  1. 創(chuàng)建 karma 配置
 // 新建 karma.conf.js,內(nèi)容如下
 module.exports = function (config) {
     config.set({

         // base path that will be used to resolve all patterns (eg. files, exclude)
         basePath: '',
            // frameworks to use
            // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
            frameworks: ['mocha', 'sinon-chai'],
            client: {
                chai: {
                    includeStack: true
                }
            },


            // list of files / patterns to load in the browser
            files: [
                'dist/**/*.test.js',
                'dist/**/*.test.css'
            ],


            // list of files / patterns to exclude
            exclude: [],


            // preprocess matching files before serving them to the browser
            // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
            preprocessors: {},


            // test results reporter to use
            // possible values: 'dots', 'progress'
            // available reporters: https://npmjs.org/browse/keyword/karma-reporter
            reporters: ['progress'],


            // web server port
            port: 9876,


            // enable / disable colors in the output (reporters and logs)
            colors: true,


            // level of logging
            // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
            logLevel: config.LOG_INFO,


            // enable / disable watching file and executing tests whenever any file changes
            autoWatch: true,


            // start these browsers
            // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
            browsers: ['ChromeHeadless'],


            // Continuous Integration mode
            // if true, Karma captures browsers, runs the tests and exits
            singleRun: false,

            // Concurrency level
            // how many browser should be started simultaneous
            concurrency: Infinity
        })
    }
  1. 創(chuàng)建 test/button.test.js 文件
 const expect = chai.expect;
 import Vue from 'vue'
 import Button from '../src/button'

 Vue.config.productionTip = false
 Vue.config.devtools = false

 describe('Button', () => {
     it('存在.', () => {
         expect(Button).to.be.ok
     })
     it('可以設置icon.', () => {
         const Constructor = Vue.extend(Button)
         const vm = new Constructor({
         propsData: {
             icon: 'settings'
         }
         }).$mount()
         const useElement = vm.$el.querySelector('use')
         expect(useElement.getAttribute('xlink:href')).to.equal('#i-settings')
         vm.$destroy()
     })
     it('可以設置loading.', () => {
         const Constructor = Vue.extend(Button)
         const vm = new Constructor({
         propsData: {
             icon: 'settings',
             loading: true
         }
         }).$mount()
         const useElements = vm.$el.querySelectorAll('use')
         expect(useElements.length).to.equal(1)
         expect(useElements[0].getAttribute('xlink:href')).to.equal('#i-loading')
         vm.$destroy()
     })
     it('icon 默認的 order 是 1', () => {
         const div = document.createElement('div')
         document.body.appendChild(div)
         const Constructor = Vue.extend(Button)
         const vm = new Constructor({
         propsData: {
             icon: 'settings',
         }
         }).$mount(div)
         const icon = vm.$el.querySelector('svg')
         expect(getComputedStyle(icon).order).to.eq('1')
         vm.$el.remove()
         vm.$destroy()
     })
     it('設置 iconPosition 可以改變 order', () => {
         const div = document.createElement('div')
         document.body.appendChild(div)
         const Constructor = Vue.extend(Button)
         const vm = new Constructor({
         propsData: {
             icon: 'settings',
             iconPosition: 'right'
         }
         }).$mount(div)
         const icon = vm.$el.querySelector('svg')
         expect(getComputedStyle(icon).order).to.eq('2')
         vm.$el.remove()
         vm.$destroy()
     })
     it('點擊 button 觸發(fā) click 事件', () => {
         const Constructor = Vue.extend(Button)
         const vm = new Constructor({
         propsData: {
             icon: 'settings',
         }
         }).$mount()

         const callback = sinon.fake();
         vm.$on('click', callback)
         vm.$el.click()
         expect(callback).to.have.been.called

     })
 })

  1. 創(chuàng)建測試腳本
    在 package.json 里面找到 scripts 并改寫 scripts
 "scripts": {
     "dev-test": "parcel watch test/* --no-cache & karma start",
     "test": "parcel build test/* --no-cache --no-minify && karma start --single-run"
 },
  1. 運行測試腳本

i. 要么使用npm run test一次性運行

image.png

這里面說 Cannot read property 'getAttribute' of null at Context.
翻譯:無法在上下文中讀取空的屬性“getAttribute”讯屈。

解決方法:

image.png

如果不能成功的話蛋哭,運行 rm -rf .cache dist/ 刪除掉上一次打包失敗,殘留的東西
成功截圖:

image.png

ii. 要么使用npm run dev-test進行 watch 運行

image.png

成果
如此一來涮母,你開發(fā)的時候新開一個命令行窗口運行 npm run dev-test 就可以實時查看測試結(jié)果谆趾。
如果你只想看一次結(jié)果,就只用運行 npm run test

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叛本,一起剝皮案震驚了整個濱河市沪蓬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌来候,老刑警劉巖跷叉,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異营搅,居然都是意外死亡云挟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門转质,熙熙樓的掌柜王于貴愁眉苦臉地迎上來园欣,“玉大人,你說我怎么就攤上這事休蟹》锌荩” “怎么了日矫?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辉饱。 經(jīng)常有香客問我搬男,道長拣展,這世上最難降的妖魔是什么彭沼? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮备埃,結(jié)果婚禮上姓惑,老公的妹妹穿的比我還像新娘。我一直安慰自己按脚,他們只是感情好于毙,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辅搬,像睡著了一般唯沮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上堪遂,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天介蛉,我揣著相機與錄音,去河邊找鬼溶褪。 笑死币旧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的猿妈。 我是一名探鬼主播吹菱,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼彭则!你這毒婦竟也來了鳍刷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤俯抖,失蹤者是張志新(化名)和其女友劉穎输瓜,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚌成,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡前痘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了担忧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芹缔。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瓶盛,靈堂內(nèi)的尸體忽然破棺而出最欠,到底是詐尸還是另有隱情示罗,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布芝硬,位于F島的核電站蚜点,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拌阴。R本人自食惡果不足惜绍绘,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迟赃。 院中可真熱鬧陪拘,春花似錦、人聲如沸纤壁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酌媒。三九已至欠痴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秒咨,已是汗流浹背喇辽。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拭荤,地道東北人茵臭。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像舅世,于是被迫代替她去往敵國和親旦委。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容