最近领导对前端提出了新的要求,要进行单元测试。之前使用vue做了一个快报名小程序的pc端页面,既然要做单元测试,就准备用这个项目了,之前有些react的经验,vue还是第一遭
vue-cli3.0单元测试方面更加完备,就先升级到了cli3.0,因为项目是用typescript写的,需要ts-jest,得到jest的配置如下
{ "jest": { "moduleFileExtensions": [ "js", "jsx", "json", "vue", "ts", "tsx" ], "transform": { "^.+\\.vue$": "vue-jest", ".+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$": "jest-transform-stub", "^.+\\.tsx": "ts-jest" }, "moduleNameMapper": { "^@/(.*)$": "<rootDir>/src/$1" }, "snapshotSerializers": [ "jest-serializer-vue" ], "testMatch": [ "**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)" ], "testURL": "http://localhost/" } }
先从简单的开始,测试了一个正则字符串常量文件,完美,一点问题没有
然后开始测方案页面的Scheme.vue组件,这个地方主要就想测一个computed属性,将三种有代表性的情况写完测试案例,兴冲冲运行yarn test:unit Scheme.test.ts,结果还不错,三个it测试用例都通过了,但后面还有一片红是什么鬼
console.error node_modules/vue/dist/vue.runtime.common.js:589
[Vue warn]: Invalid prop: type check failed for prop "headerPic". Expected String, got Object.
原来是这个地方调用了一个组件,这个组件需要一个headerPic
属性,用作图片的src,看源码
<SideNav :header-pic="require('../../assets/scheme/schemeSideNavPic.jpg')">
感觉没毛病啊,去vue-devtool,"/img/schemeSideNavPic.f988623b.jpg"
是字符串啊,一点毛病没有,应该不是require的问题啊,应该是require在jest里面的处理问题,再查看jest配置,已经对jpg
等静态文件做处理了,看了一下jest-transform-stub模块的源码,很简单
module.exports = { process: function() { return '' } }
既对这些静态文件返回空字符串,不做处理,这不就更不应该了呀,幸亏有vscode这款利器,可以方便调试源码,使用vscode调试没有报错,也没能让调试器进入vue文件,没办法,在ts文件里const pic = require('../../../assets/scheme/schemeSideNavPic.jpg')
,再次调试,发现
正是jest-transform-stub的内容,确实是个对象,跟在命令行内运行结果一致,也就是说只需要一直处理方式让其返回为
module.exports = ""
查看jest官网,搜了一下css,运气不错"_blank" href="https://jestjs.io/docs/zh-Hans/webpack#%E5%A4%84%E7%90%86%E9%9D%99%E6%80%81%E6%96%87%E4%BB%B6" rel="external nofollow" >处理静态文件,moduleNameMapper
选项完全可以满足需求啊,
"moduleNameMapper": { "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js" }
fileMock.js内容
// __mocks__/fileMock.js module.exports = 'test-file-stub';
就是说只要返回字符串就OK了,加上moduleNameMapper
,测试完美的跑通了
接下来对Scheme.vue组件发起模拟点击测试
const createScheme = wrapper.findAll('.sn-item').at(1) createScheme.trigger('click') expect((wrapper.vm as any).isCreateDialogShow).toBeTruthy() expect(wrapper.find('.create-list-dialog').isVisible()).toBeTruthy()
使用vue-test-utils的api获取createScheme元素,对其触发点击,测试isCreateDialogShow这个data值被设置成true, 使用的element-ui
<el-dialog :visible.sync="isCreateDialogShow" width="600px" class="create-list-dialog" title="创建方案"> ... </el-dialog>
此dialog可见,顺利通过
接下来再实验一下新功能,快照,使用toMatchSnapshot
方法也顺利通过了
接下来来个大的,测试一下Login.vue,登陆页面,主要测其调接口,然后成功设置store值,但不能走真实的网络接口啊,这太慢不说,具体结果还不能预测,得使用mock数据
在项目中创建了axios.plugin.ts
vue插件,这可怎么mock呀,再看官方文档,感觉Manual Mocks部分最合适,但是举例也不适合vue 插件mock啊,继续浏览网站,不知道是受哪的启发还是突然开窍了,应该是受fs
模块启发,突然知道怎么mock插件了,mock一个模块只需要模仿其型即可,具体实现,就无所谓了,这个http请求插件的mock必须能返回我们期望的值啊,fs
模块的__setMockFiles
又给了我启示,可以直接给接口的返回result设值啊,然后就有来下面的
__mocks__/axios.plugin.ts
文件
const MockAxios = {} as any let result = {} as any MockAxios.install = (Vue: any, options: any) => { Vue.prototype.$axios = function () { /* eslint-disable prefer-promise-reject-errors */ return new Promise((resolve, reject) => { if (result.ResultCode === '200') { return result.Info } else { reject({ code: result.ResultCode, msg: result.Message, info: result.Info }) } }) } } MockAxios.__setMockData = (data: any) => { result = data } export default MockAxios
然后一马平川了,localVue.use(Vuex)
, localVue.use(AxiosPlugin)
const mockData = { ResultCode: '200', Msg: true, Info: { OpenId: 99, UserId: 92003, }, } AxiosPlugin.__setMockData(mockData) (wrapper.vm as any).login({ code: '29992' }).then(() => { expect(wrapper.vm.$store.state.userInfo.OpenId).toBe(mockData.Info.OpenId) expect(wrapper.vm.$store.state.userInfo.UserId).toBe(mockData.Info.UserId) })
完美通过,vue的单元测试框架算是基本搭好了,也能给领导说说了
给领导看还得有个覆盖率报告
yarn test:unit --coverage
覆盖的文件比较少啊,不包含所有的源文件啊,需要加入collectCoverageFrom
配置项,至此整个单元测试就比较完备了
下面是完整jest的配置
{ "jest": { "moduleFileExtensions": [ "js", "jsx", "json", "vue", "ts", "tsx" ], "transform": { "^.+\\.vue$": "vue-jest", ".+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$": "jest-transform-stub", "^.+\\.tsx": "ts-jest" }, "moduleNameMapper": { "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js", "^@/(.*)$": "<rootDir>/src/$1" }, "snapshotSerializers": [ "jest-serializer-vue" ], "testMatch": [ "**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)" ], "testURL": "http://localhost/", "collectCoverageFrom": [ "**/*.{vue,ts}", "!**/node_modules/**", "!**/*.d.ts" ] } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]