Vue單元測試case寫法

書接上文摩梧,karma+webpack搭建vue單元測試環(huán)境介紹了vue單元測試環(huán)境搭建及查看源文件的測試覆蓋覆蓋率。今天來說一下vue單元測試思路和case的寫法宣旱。測試框架使用jasmine仅父,語法參考

代碼地址:https://github.com/MarxJiao/vue-karma-test/tree/spec-demo

測試關(guān)注點

對于vue組件浑吟,單元測試測試主要關(guān)注以下幾點:

  • vue組件加載后笙纤,各數(shù)據(jù)模型是否符合預(yù)期
  • 定義的方法是否可用
  • filter是否可用
  • 帶有props的組件,數(shù)據(jù)能否正常傳遞
  • 異步更新DOM的情況

組件加載后的狀態(tài)

要測試組件加載后的狀態(tài)组力,首先我們需要將vue組件生成實例省容。并檢測掛載后實例的數(shù)據(jù)狀態(tài)。下面是個示例:

我們來看下src/app.vue組件的代碼:

<template>
    <div>
        <h1>{{title}}</h1>
        <vc-message :message="message"></vc-message>
    </div>
</template>

<script>
    import child from './components/child.vue'
    export default {
        data() {
            return {
                title: '標(biāo)題',
                message: '這是子組件'
            }
        },
        components: {
            'vc-message': child
        },
        mounted() {
            this.title = 'Hello world'
        },
        methods: {
            setMessage(msg) {
                this.message = msg;
            }
        }
    }
</script>

組件加載后title的值應(yīng)該變成'Hello world'忿项,所以我們這樣來寫測試代碼

// 引用vue
import Vue from 'vue';

// 引用要測試的組件
import app from '../../src/app.vue';

// 描述要測試的內(nèi)容
describe('test app.vue', () => {
    
    // 描述要測試的最小單元
    it('組件加載后蓉冈,title應(yīng)該是Holle world', () => {

        // 這里將app生成vue實例,并使用 $mount() 模擬掛載狀態(tài)
        let vm = new Vue(app).$mount();

        // 斷言組件的title是否變?yōu)榱?Hello world'
        expect(vm.title).toEqual('Hello world');
    });
});

執(zhí)行karma start我們能看到測試通過轩触。

測試組件里面的方法

我們知道vue將data和methods都掛在了vue實例的根節(jié)點下寞酿,所以測試vue組件中的方法也和上面測試狀態(tài)一樣,直接調(diào)用vm的方法就行了脱柱。我們來測試以下setMessage方法:

// 引用vue
import Vue from 'vue';

// 引用要測試的組件
import app from '../../src/app.vue';

// 描述要測試的內(nèi)容
describe('test app.vue', () => {
    
    // 描述要測試的最小單元
    it('設(shè)置message為『你好世界』', () => {

        // 這里將app生成vue實例伐弹,并使用 $mount() 模擬掛載狀態(tài)
        let vm = new Vue(app).$mount();

        // 執(zhí)行setMessage方法
        vm.setMessage('你好世界');

        // 斷言組件的message是否變?yōu)榱?你好世界'
        expect(vm.message).toEqual('你好世界');
    });
});

執(zhí)行karma start,就會看到測試成功榨为。如果剛才沒有關(guān)閉karma的話惨好,在watch模式下,測試會自動進行随闺。

怎么樣日川?有沒有感覺vue單元測試非常簡單,趕緊做起來吧矩乐。

filter測試

filter的測試就更簡單了龄句。filter就是純函數(shù),有固定的輸入輸出散罕,我們只需要執(zhí)行函數(shù)看預(yù)期結(jié)果就好了分歇。我們?yōu)榻M件添加一個轉(zhuǎn)換大寫的filter:

<template>
...

    <h1>{{title | upperCase}}</h1>

...

</template>

<script>

...

    filters: {
        upperCase(str) {
            return str.toUpperCase();
        }
    }

...
</script>

測試這個filter

// 引用要測試的組件
import app from '../../src/app.vue';

// 描述要測試的內(nèi)容
describe('test app.vue', () => {

    it('upperCase過濾器能把app轉(zhuǎn)換為APP', () => {

        // vue 組件export出來的是個對象,我們直接用這個對象的屬性和方發(fā)就能調(diào)用到要測試的filter
        let appStr =  app.filters.upperCase('app');

        // 斷言組件的appStr是為'APP'
        expect(appStr).toEqual('APP');
    });
})

props測試

props依賴父組件欧漱,這個怎么測試呢职抡。我們來看下vue官方提供的方法
使用Vue.extend()將組件掛載Vue構(gòu)造器上,用propsData加入props數(shù)據(jù)误甚,之后new一個Vue實例缚甩,這樣就生成了一個獨立的帶props的vm和前面的實例一樣谱净,可以進行各種測試。
我們的child組件:

<template>
    <div>
        <div>{{message}}</div>
    </div>
</template>

<script>
    export default {
        props: ['message']
    }
</script>

測試child組件

// 引用vue
import Vue from 'vue';

// 引用要測試的組件
import child from '../../src/components/child.vue';

/**
 * 獲取生成的vm
 *
 * @param {Object} Component 組件
 * @param {Object} propsData props數(shù)據(jù)
 * @return {Object} vue實例
 */
function getRenderedVm (Component, propsData) {
    const Ctor = Vue.extend(Component)
    const vm = new Ctor({ propsData }).$mount()
    return vm
}

// 描述要測試的內(nèi)容
describe('test child.vue', () => {
    
    // 描述要測試的最小單元
    it('組件加載后蹄胰,child組件的message應(yīng)該是「這是子組件」', () => {
        let childvm = getRenderedVm(child, {
            message: '這是message'
        });

        // 斷言組件的child組件的props是否生效
        expect(childvm.message).toEqual('這是message');
    });
});

是不是so easy.

異步更新DOM的情況

異步更新DOM的情況岳遥,參考vue官網(wǎng)的示例
使用Vue.nextTick來查看異步數(shù)據(jù)更新后dom是否變化

// 引用vue
import Vue from 'vue';

// 引用要測試的組件
import app from '../../src/app.vue';

// 描述要測試的內(nèi)容
describe('test app.vue', () => {
    
    // 異步數(shù)據(jù)更新
    it('數(shù)據(jù)更新后,視圖應(yīng)該改變', done => {

        // 這里將app生成vue實例裕寨,并使用 $mount() 模擬掛載狀態(tài)
        let vm = new Vue(app).$mount();

        // 掛載后改變title
        vm.title = 'APP';

        Vue.nextTick(() => {
            let title = vm.$el.getElementsByTagName('h1')[0]
            expect(title.textContent).toEqual('APP')
            done();
        })
    });
});
    

以上就是對vue組件單元測試的用例編寫的介紹,例子舉得比較簡單派继,主要是介紹各種情況的測試方法宾袜。

相關(guān)鏈接

karma+webpack搭建vue單元測試環(huán)境

Vue官網(wǎng)單元測試介紹

Jasmine introduction

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市驾窟,隨后出現(xiàn)的幾起案子庆猫,更是在濱河造成了極大的恐慌,老刑警劉巖绅络,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件月培,死亡現(xiàn)場離奇詭異,居然都是意外死亡恩急,警方通過查閱死者的電腦和手機杉畜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衷恭,“玉大人此叠,你說我怎么就攤上這事∷嬷椋” “怎么了灭袁?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長窗看。 經(jīng)常有香客問我茸歧,道長,這世上最難降的妖魔是什么显沈? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任软瞎,我火速辦了婚禮,結(jié)果婚禮上构罗,老公的妹妹穿的比我還像新娘铜涉。我一直安慰自己,他們只是感情好遂唧,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布芙代。 她就那樣靜靜地躺著,像睡著了一般盖彭。 火紅的嫁衣襯著肌膚如雪纹烹。 梳的紋絲不亂的頭發(fā)上页滚,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音铺呵,去河邊找鬼裹驰。 笑死,一個胖子當(dāng)著我的面吹牛片挂,可吹牛的內(nèi)容都是我干的幻林。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼音念,長吁一口氣:“原來是場噩夢啊……” “哼沪饺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起闷愤,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤整葡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后讥脐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遭居,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年旬渠,在試婚紗的時候發(fā)現(xiàn)自己被綠了俱萍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡坟漱,死狀恐怖鼠次,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芋齿,我是刑警寧澤腥寇,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站觅捆,受9級特大地震影響赦役,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜栅炒,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一掂摔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赢赊,春花似錦乙漓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至玩讳,卻和暖如春涩蜘,著一層夾襖步出監(jiān)牢的瞬間嚼贡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工同诫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粤策,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓误窖,卻偏偏與公主長得像叮盘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贩猎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

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