
【免费下载链接】vue-mdcMaterial web components for Vue.js项目地址https://gitcode.com/gh_mirrors/vu/vue-mdc点击查看免费下载vue-mdc 是一款基于 Vue.js 的 Material 设计系统组件库。它的测试体系很特别同一套 Mocha 测试用例既能通过 Karma 在真实 Chrome 里跑自动化断言又能以可视化测试模式在开发服务器上把每个用例渲染成可交互的组件——测试通过与否你亲眼就能看见。本文带你完整拆解这套 Karma Mocha 可视化测试的实现细节。Vue 组件测试为什么非浏览器不可传统 Node 环境测试如 Jest jsdom对纯逻辑组件够用但对 vue-mdc 这类 UI 组件库浏览器环境有天然优势CSS 类名断言更可信Material 组件靠mdc-button--raised这类 BEM 类名驱动外观真实浏览器渲染后才能确认动画与生命周期真实ripple波纹、Dialog展开等效果依赖requestAnimationFrame所见即所得WYSIWYG跑完测试页面上直接留下证据失败的组件还停留在页面上供你检查vue-mdc 的做法是让测试用例在浏览器里生成真实的 Vue 实例并把实例渲染结果直接挂到 Mocha 的报告条目里。整体架构一份用例两种跑法整个测试目录结构如下test/ ├── index.js # Karma 模式入口 ├── visual.js # 可视化模式入口 ├── karma.conf.js # Karma Webpack 配置 ├── helpers/ │ ├── utils.js # createVM 双模式工厂 │ ├── Test.vue # 可视化测试容器组件 │ ├── index.js # 可复用断言助手 │ └── wait-for-update.js # nextTick 链式工具 └── specs/ # 各组件测试用例Button、Card、Drawer…核心设计藏在 createVM 里export function createVM (context, template, opts {}) { return isKarma ? createKarmaTest(context, template, opts) : createVisualTest(context, template, opts) }通过检测window.__karma__全局变量判断运行环境同一份 spec 文件零改动即可在两种模式下运行。用例作者写的是Button classmy-buttonClick me/Button这样的模板字符串完全感知不到底层差异。Karma 配置详解复用开发配置省一半代码打开 test/karma.conf.js最聪明的一笔在第 2 行——直接复用开发服务器的 Webpack 配置const baseConfig require(../build/webpack.config.dev.js) const webpackConfig merge(baseConfig, { devtool: #inline-source-map })然后只做最小化的测试改造删除应用入口delete webpackConfig.entry第 17 行因为测试不需要把 vue-loader 的 js loader 换成本地babel-loader第 11-14 行让 Babel 插件生效——package.json中配置了babel-plugin-istanbul在 test 环境下注入覆盖率代码单文件入口files: [./index.js]由require.context自动收集所有 spectest/index.js 第 22-23 行关键配置一览第 25-42 行配置项值作用browsers[Chrome]真实浏览器执行非 jsdom 模拟frameworks[mocha, chai-dom, sinon-chai]Mocha 跑用例chai chai-dom 断言 DOM 类名reporters[spec, coverage]终端可读报告 覆盖率统计preprocessors[webpack, sourcemap]Webpack 编译 .vue 文件内联 sourcemap 方便定位coverageReporterlcov text-summary输出coverage/lcov.info供 CI 上传可视化测试如何做到所见即所得这是整套体系最有意思的部分全部逻辑在 test/visual.js 中不到 80 行。第一步给每个用例准备专属 DOM 容器beforeEach(function () { this.DOMElement document.createElement(DIV) this.DOMElement.id test-${testId} document.body.appendChild(this.DOMElement) })每个测试开始前动态插入一个带唯一 id 的 div。createVisualTest会把 Vue 实例挂载到它上面utils.js 第 49-82 行。第二步把渲染结果搬进 Mocha 报告afterEach(function () { const lastReportElement testReportElements[testReportElements.length - 1] const el document.getElementById(this.DOMElement.id) if (el) lastReportElement.appendChild(el) })Mocha 在浏览器中本身就是用 DOM 渲染报告页的项目通过import mocha/mocha.js手动引入并setup见 visual.js 第 10-27 行。每个用例跑完后把容器里渲染出的组件appendChild到对应的测试报告li中——你在报告里看到的每一条 it 标题下方就是这条用例刚刚渲染出来的真实 Material 组件。第三步Test.vue 让组件可以折叠排查可视化模式下每个用例被包在一个 Test.vue 容器里它提供一个 / -切换按钮可隐藏/显示该用例渲染的内容边框样式由 style.css 定义保证报告页排版整齐第四步自动隐藏通过的测试只留案发现场after(function () { vms.forEach(vm { if (vm.$el.parentElement !vm.$el.parentElement.classList.contains(fail)) { vm.$children[0].visible false } }) })测试全部结束后凡是父元素没有fail类即通过的用例其组件自动隐藏失败的组件保留在页面上一目了然。配合 Mocha 的checkLeaks()第 75 行内存泄漏检查也一并完成。整个流程可以概括为用例挂载真实组件 → 组件渲染进报告条目 → 通过则隐藏失败则展示 → 开发者直接肉眼复核可复用测试助手少写样板代码的关键组件库有 Button、Card、Drawer、List 等一大堆组件共性断言被抽成了工厂函数集中在 test/helpers/index.js助手函数解决的问题dataPropagationTest(Component)第 5-18 行验证 custom class、事件是否正确透传用sinon.spy监听点击attrTest(it, base, Component, attrs)第 20-45 行遍历属性列表逐个验证mdc-button--raised这类修饰类随 prop 动态增减foundationDetroyTest(Component)第 46-64 行用 spy 验证组件移除时 Material Foundation 的destroy被正确调用于是 Button.spec.js 全文只有 31 行describe(Button.vue, function () { it(renders an upgraded button, function () { const vm createVM(this, Button classmy-buttonClick me/Button , { components: { Button } }) vm.$(button).should.have.text(Click me) vm.$(button).should.have.class(mdc-button) }) it(keeps original tag data, dataPropagationTest(Button)) describe(attrs, function () { attrTest(it, mdc-button, Button, [ dense, raised, compact, primary, accent, theme-dark, ]) }) })其中vm.$(button)不是原生 API而是项目扩展的 Vue 实例方法在全局选择结果里过滤出属于当前组件的元素并始终返回可链式.should的对象找不到时返回空 NodeList避免 NPE让断言写得像自然语言。nextTick 链式工具优雅处理 Vue 异步更新Vue 的 DOM 更新是异步的涉及响应式的用例必须等nextTick。wait-for-update.js 实现了一个可串联的链式等待器nextTick().then(() { vm.$(.mdc-button).should.have.class(mdc-button--raised) }).then(done)它的巧妙之处在于每执行一个.then回调后如果还有下一个回调就再等一个requestAnimationFrame Vue.nextTick第 38-40 行自动在每一步之间等待 DOM 更新用例作者无需手动插入延迟。ripple.spec.js 中验证波纹指令挂载/卸载类名的 7 个用例全靠它保持稳定。本地运行测试两条命令跑遍两种模式在 package.json 中# Karma 单次运行CI 同款输出覆盖率到 test/coverage/ npm test # 启动可视化测试 webpack-dev-server边跑边看组件 npm run dev # 同上但带实时覆盖率统计 npm run dev:coverage两个前置注意点可视化模式的 webpack.config.dev.js 入口指向test/visual.js并依赖预先构建的 DLLMocha、Chai、Vue 等测试重依赖首次使用需先执行npm run build:dll否则直接报错退出Karma 模式跑在BABEL_ENVtest下package.json 第 27 行这正是babel-plugin-istanbul覆盖率插件的开关CI 自动化CircleCI 一键覆盖全流程circle.yml 定义了完整的自动化链路test: pre: - npm rebuild node-sass - yarn build:dll # 先构建 DLL override: - yarn test # 即 npm testKarma 单次运行 post: - bash (curl -s https://codecov.io/bash) # 覆盖率上传 - cat test/coverage/lcov.info | ./node_modules/.bin/codacy-coverageyarn install带 yarn 缓存加速npm rebuild node-sass解决二进制依赖问题。加上 CONTRIBUTING.md 中没有测试的 PR 不会被接受的约定测试体系同时承担着质量门禁的角色。总结这套体系值得借鉴的 4 个设计设计价值window.__karma__双模式分支utils.js同一用例同时服务 CI 自动化与本地可视化排查零维护成本渲染结果挂进 Mocha 报告条目visual.js测试报告即 UI 展示所见即所得断言助手工厂函数helpers/index.js每个组件的 spec 保持 30 行以内属性测试批量生成自动隐藏通过用例visual.js报告页只呈现失败案发现场排查效率翻倍如果你也在为 Vue 组件库搭建测试体系vue-mdc 给出的答案清晰而克制Mocha 负责用例、Karma 负责真实浏览器、Webpack 负责编译 .vue、几十行把 DOM 搬进报告的代码负责所见即所得。核心源码全部位于 test/ 目录值得逐行研读。赞分享【免费下载链接】vue-mdcMaterial web components for Vue.js项目地址https://gitcode.com/gh_mirrors/vu/vue-mdc点击查看免费下载相关推荐electron-vue 测试体系完全指南Karma Mocha 单元测试与 Spectron 端到端测试实战electron vue 测试体系完全指南Karma Mocha 单元测试与 Spectron 端到端测试实战 导读 本篇指南以 electron vue前端桌面应用electron-vue 测试体系全解析基于 Karma、Mocha 与 Spectron 的单元测试与端到端测试实践electron vue 测试体系全解析基于 Karma、Mocha 与 Spectron 的单元测试与端到端测试实践 electron vue 是一个以 E前端桌面应用electron-vue 单元测试完全指南基于 Karma Mocha Chai 的 Vue 组件测试体系electron vue 单元测试完全指南基于 Karma Mocha Chai 的 Vue 组件测试体系 导读 本文以 electron vue 官前端桌面应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考