Vue 单元测试

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

定义:

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

指令:

package.json文件

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

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

mocha+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

Vue 单元测试 使用mocha+jest的更多相关文章

  1. Vue单元测试Karma+Mocha

    Vue单元测试Karma+Mocha Karma是一个基于Node.js的JavaScript测试执行过程管理工具(Test Runner).该工具在Vue中的主要作用是将项目运行在各种主流Web浏览 ...

  2. 使用Karma、Mocha实现vue单元测试

    Karma Karma是一个基于Node.js的JavaScript测试执行过程管理工具(Test Runner).该工具在Vue中的主要作用是将项目运行在各种主流Web浏览器进行测试.换句话说,它是 ...

  3. 前端单元测试框架-Mocha

    引言 随着前端工程化这一概念的产生,项目开发中前端的代码量可谓是'急剧上升',所以在这种情况下,我们如何才能保证代码的质量呢,对于框架,比如React.Vue,因为有自己的语法规则,及时每个开发人员的 ...

  4. 使用 Jest 进行 Vue 单元测试

    本文介绍:1.vue-cli3下jest环境的搭建2.vue组件基本的测试方法 环境配置 vue-cli3 的插件使安装流程变得格外简单,通过 vue ui 启动可视化管理系统,在插件栏,点击 ‘添加 ...

  5. 学习笔记——在vue中如何配置Jest(一)

    最近在搞Jest单元测试,如何在vue中安装和使用jest我就不说了,前一篇文章简单的说了一下在使用jest时遇到的一些问题,但是我觉得并没有真正的解决的很好.后面会在学习过程中更新前面的那篇文章,加 ...

  6. vue 单元测试

    单元测试 配置和工具 任何兼容基于模块的构建系统都可以正常使用,但如果你需要一个具体的建议,可以使用Karma进行自动化测试.它有很多社区版的插件,包括对webpack和browserify的支持. ...

  7. Vue单元测试vue2-jest-coverage的package.json 配置

     依赖的版本很重要,不要出错了 devDependencies:{ "babel-core": "^6.26.3", "babel-jest" ...

  8. 前端js单元测试 使用mocha、chai、sinon,karma

    karma(因果报应)  提供在浏览器上测试  可以同时跑在多个浏览器下 mocha测试框架  其他测试框架还有Jasmine chai断言库  expect = chai.expect sinon ...

  9. #单元测试#以karma+mocha+chai 为测试框架的Vue webpack项目(二)

    学习对vue组件进行单元测试,先参照官网编写组件和测试脚本. 1.简单的组件 组件无依赖,无props 对于无需导入任何依赖,也没有props的,直接编写测试案例即可. /src/testSrc/si ...

随机推荐

  1. [原][资料整理][osg]osgDB文件读取插件,工作机制,支持格式,自定义插件

    参考: osgPlugins相关 osg读取文件的原理(插件工作机制) 当使用osgDB读取文件时,会自动根据文件的扩展名来到插件目录中寻找相应的插件,来实现. 比如: osgviewer cow.o ...

  2. Vue路由编程式导航以及hash模式

    import Vue from 'vue'; import App from './App.vue'; //引入公共的scss 注意:创建项目的时候必须用scss import './assets/c ...

  3. Spring cloud微服务安全实战-4-4 OAuth2协议与微服务安全

    Oauth2 解决了cookie和session的问题 搭建认证服务器 把依赖都复制进来 因为搭建的是Oauth的服务器,所以还需要导入oauth2 开始写代码 首先创建启动类 增加配置文件 端口设置 ...

  4. Locust性能测试-分布式执行的方法(亲测ok)

    来源:https://www.cnblogs.com/yoyoketang/p/11681370.html 前言 使用Locust进行性能测试时,当一台单机不足以模拟所需的用户数量的时候,可以在多台机 ...

  5. FreeMarker的应用场景

      FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是一 ...

  6. layer confirm 三种选择按钮

    layer.confirm('请选择是否通过提现?(tips:同意直接打款,驳回不可恢复)', { btn : ['通过-打款','不通过','通过-已打款'], btn1:function(){ a ...

  7. Apache POI操作pptx基本使用

    最近有一个ppt操作的需求,因此查了下相关的资料 ppt分类 (1)2007版之前的 是基于二进制的文件格式 细节没有完全公开,第三方厂商多是用单向工程方法猜测和分析出来的.WPS做得好一些,但开源的 ...

  8. RBF神经网络学习算法及与多层感知器的比较

    对于RBF神经网络的原理已经在我的博文<机器学习之径向基神经网络(RBF NN)>中介绍过,这里不再重复.今天要介绍的是常用的RBF神经网络学习算法及RBF神经网络与多层感知器网络的对比. ...

  9. Python机器学习基础教程-第2章-监督学习之决策树集成

    前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...

  10. ding

    Import "shanhai.lua"Dim currHour,currMinute,currSecondDim mmRnd = 0Dim sumFor=Int(ReadUICo ...