Vue 单元测试

[toc]

Vue 单元测试

官网:https://vue-test-utils.vuejs.org/zh

定义:

单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。

指令:
package.json文件

  • "test:unit": "vue-cli-service test:unit"

测试驱动开发(TDD:Test-Driven Development)

mocha+jest

  • 断言库 jest

jest

实例 mocha expect方法断言

  • 格式模板

    describe 套件

        describe('名称',()=>{
            <!-- 用例 -->
            it('方法描述',()=>{
                /* 使用expect 断言语句 */
                /* 方法举例 */
                expcect(/* 需要检测的方法 */).to.be.equal(/* 检测结果 */)
            })
        })
    
  • 描述

it()

测试异步代码 通过将回调(通常称为done)添加到it()

.to.be.equal 是否相等
.to.be.deep.equal 是否严格相等

示例代码

tests\unit\parser.spec.ts

  1. 测试各类断言语句执行成功或者失败

    /* 编写测试用例 */
    import {parser,stringify} from '@/code/parser';
    /* 使用mocha(测试工具) +chai(断言库) */
    import { expect } from 'chai';
    /* 套件 */
    describe('mytest1', () => {
        /* 用例 */
        // 常见的关系 相等 大于/小于 包含和不包含
        it('测试parser方法是否可用',()=>{
            // deep.equal 表示两个对象是否完全相等(引用空间无所谓)
            // .to.be.equal 表示两个对象相等(引用空间无所谓)
            expect(parser('name=zfpx')).to.be.deep.equal({name:'zfpx'})
        })
        it('测试stringify方法是否可用',()=>{
            expect(stringify({name:'3px'})).to.be.equal('name=3px')
        })
    })
    /* 断言语句各类 */
    describe('测试方法',()=>{
        it('相等关系',()=>{
            expect(1+1).to.be.equal(2);//相加的值
            expect([1,2,3]).to.be.lengthOf(3);//长度
            expect(true).to.be.true;//布尔值
        })
        it('包含',()=>{
            expect('zfpx').to.be.contain('zf');//是否包含指定字符
            expect('zfpx').to.be.match(/zf/);//是否匹配正则
    
        })
        it('大于,小于',()=>{
            expect(5).to.be.greaterThan(3)
            expect(3).to.be.lessThan(6)
            expect(3).to.be.not.greaterThan(5)//不大于3
        })
    })
    
    
  2. 测试模块是否正确渲染值

    src\components\unittest\demo1.vue

    <!-- 单元测试:是否能成功显示渲染的组件元素  -->
    <template>
    <div class="demo1">
        <h1>{{ datas }}</h1>
    </div>
    </template>
    
    <script>
    export default {
        name:'demo1',
        props:['datas'],
        data () {
            return {
                
            };
        }
    }
    
    </script>
    <style lang='less' scoped>
    </style>
    
    

    tests\unit\unit1.spec.ts

    import unitdemo1 from '@/components/unittest/demo1.vue';
    import Vue from 'vue';
    import {expect} from  'chai';
    import {mount} from  '@vue/test-utils';
    /* 写法1 产地属性后能否正常显示结果*/
    describe('unitdemo1',()=>{
        it('1.传递属性后能否正常显示结果',()=>{
            // 原生自己测试vue
            // extend 方法可以根据实例创建一个类
            let Constructor = Vue.extend(unitdemo1);
            // 对组件进行挂载
            // vm.$el mocha 测试的时候集成了 jsdom
            let vm:any = new Constructor({
                propsData:{datas:'hello'}
            }).$mount();
    
            /* 检测h1标签内是否包含hello */
    
            expect(vm.$el.querySelector('h1').innerHTML).to.be.contain('hello');
        })
    })
    /* 写法2 使用mount */
    describe('unitdemo1',()=>{
        it('2.传递属性后能否正常显示结果',()=>{
            let wrapper = mount(unitdemo1);
            /* 设置 Wrapper vm 的 prop 并强制更新。
            https://vue-test-utils.vuejs.org/zh/api/wrapper/setProps.html
            */
            wrapper.setProps({datas:'hello'});//设定传递的值为hello
            expect(wrapper.find('h1').text()).to.be.contain('hello');
        })
    })
    
  3. 测试模块内的加法是否执行

    src\components\unittest\demo2.vue

    <!--  -->
    <template>
    <div>
        <span id="count">{{count}}</span>
        <button @click = "increment">+</button>
    </div>
    </template>
    <script>
    //这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
    //例如:import 《组件名称》 from '《组件路径》';
    
    export default {
    //import引入的组件需要注入到对象中才能使用
    components: {},
    data() {
        //这里存放数据
        return {
            count:10
        };
    },
    //监听属性 类似于data概念
    computed: {},
    //监控data中的数据变化
    watch: {},
    //方法集合
    methods: {
        increment(){
            this.count++
        }
    },
    //生命周期 - 创建完成(可以访问当前this实例)
    created() {},
    //生命周期 - 挂载完成(可以访问DOM元素)
    mounted() {},
    beforeCreate() {}, //生命周期 - 创建之前
    beforeMount() {}, //生命周期 - 挂载之前
    beforeUpdate() {}, //生命周期 - 更新之前
    updated() {}, //生命周期 - 更新之后
    beforeDestroy() {}, //生命周期 - 销毁之前
    destroyed() {}, //生命周期 - 销毁完成
    activated() {} //如果页面有keep-alive缓存功能,这个函数会触发
    };
    </script>
    <style lang='lesss' scoped>
    /* //@import url(); 引入公共css类 */
    </style>
    

    tests\unit\unit2.spec.ts

    import unitdemo2 from '@/components/unittest/demo2.vue';
    import Vue from 'vue';
    import {expect} from  'chai';
    import {mount} from  '@vue/test-utils';
    
    /* 写法2 使用mount */
    describe('测试demo2组件',()=>{
        it('单机能否+1',()=>{
            let wrapper = mount(unitdemo2);
            expect(wrapper.find('#count').text()).to.be.equal('10');
            wrapper.find('button').trigger('click');
            expect(wrapper.find('#count').text()).to.be.equal('11');
        })
    })
    

    测试代码执行:npm run test:unit

测试结果


     DONE  Compiled successfully in 3577ms

    [=========================] 100% (completed)

    WEBPACK  Compiled successfully in 3577ms

    MOCHA  Testing...

    { name: 'zfpx' }
    name=zfpx


    mytest1
        √ 测试parser方法是否可用
        √ 测试stringify方法是否可用

    测试方法
        √ 相等关系
        √ 包含
        √ 大于,小于

    unitdemo1
        √ 1.传递属性后能否正常显示结果

    unitdemo1
        √ 2.传递属性后能否正常显示结果

    测试demo2组件
        √ 单机能否+1


    8 passing (111ms)

    MOCHA  Tests completed successfully
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容