组件单元测试开发过程小总结

6 篇文章 0 订阅
5 篇文章 0 订阅

前言

最近在开发公司内部公共组件的使用样例和代码单元测试。
具体单元检测框架的知识,可以查看另一篇博文:
单元测试框架Jasmine学习笔记

开发过程中遇到的一点问题就容易纠结很久,为了能够吸取教训,特地将遇到的问题记录下来,避免以后再犯,加深对代码的理解。

问题1:ES6语法的文件引用

ES6使用export导出模块时,代码如下:

export default {
    //导出模块
}

而如果引用时简单使用如下代码是不能生效的:

var KsAlert = require('./KsAlert.js');

可以采取以下两种方式来引用模块:
方式一:仍使用require引入,代码如下:

var KsAlert = require('./KsAlert.js').default;

方式二:使用import引入,代码如下:

import KsAlert from './KsAlert.js';

以上两种方法都可以引入KsAlert模块。

问题2:Vue中template

Jasmine框架测试代码程序单元时,template包含多个顶级元素则会报错,例如:

var Vue = require('vue');
import KsAlert from './KsAlert.js';
//之前所说的引用模块

describe('KsAlert',()=>{
    var vm;
    beforeEach(()=>{
        vm = new Vue({
            data() {
                return {
                    ksAlert: null
                }
            },
            ready() {
                this.ksAlert = new KsAlert('.alert-div');
            },
            methods: {
                alertIt(content) {
                    this.ksAlert.send(content);
                }
            },
            //包含多个顶级元素
            template: `<div class="alert-div"></div>
            <button type="button" @click="alertIt('this is a test!!!')">基础弹窗</button>
            `
        }).$mount().$appendTo('body');
    });
    afterEach(() => {
        vm.$destroy(true);
    });
    it('点击弹出窗口',(done)=>{
        vm.$nextTick(()=>{
            var btn = vm.$el.querySelector('button');
            $(btn).trigger('click');
            vm.$nextTick(()=>{
                var alertMsg = vm.$el.querySelectorAll('.ks-vui-alert-wrap-box');
                expect(alertMsg[0]).toBeDefined();
                done();
            });
        });
    });
});

而最终导致出现以下错误:

Karma Run Failed: undefined
Missing error handler on `socket`.
undefined

若将上面的template代码修改为:

template: `<div class="alert-div">
    <button type="button" @click="alertIt('this is a test!!!')">基础弹窗</button>
    </div>
`

则可以正常通过检测。

问题3:vm.$destroy()

Vm.$destroy()需要传递一个true参数才会将原有的vm对象完全销毁,Vue.js的中文API中介绍到:
Vue.js关于vm.$destroy()介绍

问题4:Vue的ready()

Vue中的ready()在编译结束和$el第一次插入文档之后调用,而且必须是由Vue插入(如vm.$appendTo等方法或指令更新)才触发ready()
例如:

vm = new Vue({
    data() {
        return {
            ksAlert: null
        }
    },
    ready() {
        this.ksAlert = new KsAlert('.alert-div');
    },
    methods: {
        alertIt(content) {
            this.ksAlert.send(content);
        }
    },
    template: `<div class="alert-div">
    <button type="button" @click="alertIt('this is a test!!!')">基础弹窗</button>
    </div>
    `
}).$mount().$appendTo('body');//使用appendTo()插入Vue才会触发ready()

附上Vue的生命周期图示:

Vue生命周期示意图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GJWeigege

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值