前言
Vue 的单元测试是前端开发中不可或缺的一个环节,它可以大大提升代码的可靠性和维护性。而 Jest 是目前社区中使用最为广泛的 JavaScript 测试框架之一。本文将详细介绍 Jest 在 Vue 单元测试中的应用。
Jest 的基础应用
安装与配置
首先,安装 Jest:
npm install --save-dev jest
然后,新建一个 test
目录,并在其中创建一个测试文件 mytest.spec.js
:
describe('my test', () => { test('should be true', () => { expect(true).toBe(true) }) })
最后,配置 Jest。在 package.json
中添加以下代码:
"scripts": { "test": "jest" },
这样,在命令行中运行 npm test
就可以执行 Jest 测试了。
测试方法
下面是一些 Jest 中常用的测试方法:
describe(name, fn)
:定义一个测试组;test(name, fn, timeout)
:定义一个测试用例;expect(value)
:返回一个 Expectation 匹配器对象;toBe(value)
:比较匹配器,用于准确匹配简单类型的值;toEqual(value)
:比较匹配器,用于深度匹配对象和数组;not.toBe(value)
:否定匹配器,判断值是否不等于某个值;toThrow(error?)
:异常匹配器,判断函数是否抛出了某个错误;toHaveBeenCalled()
:函数调用次数匹配器,判断函数是否被调用;toHaveBeenCalledWith(...args)
:函数参数匹配器,判断函数是否被传入了指定的参数。
Vue 中的 Jest 测试
安装相关依赖
在 Vue 项目中使用 Jest 测试,我们需要额外安装一些工具和依赖:
npm install --save-dev jest vue-jest @vue/test-utils babel-jest
其中:
vue-jest
可以使得 Jest 理解 Vue 单文件组件;@vue/test-utils
可以使得我们更方便地模拟 Vue 组件;babel-jest
可以使得 Jest 理解 ES6+ 语法。
配置 Jest
在项目根目录下新建一个 jest.config.js
文件:
module.exports = { preset: '@vue/cli-plugin-unit-jest', testMatch: [ '**/tests/**/*.(spec|test).[jt]s?(x)', '**/__tests__/*.[jt]s?(x)' ] }
其中:
preset
指定 Jest 的 preset,告诉 Jest 使用 Vue CLI 已预置好的 Jest 配置;testMatch
指定测试文件的查找规则,这样 Jest 才能找到需要测试的文件。
Vue 组件的单元测试
使用 @vue/test-utils
可以方便地模拟 Vue 组件。下面是一个例子。
新建一个 src/components/Counter.vue
文件:
-- -------------------- ---- ------- ---------- ------- ----- -------- ----------- -------- ------ ------- - ------ - ------ - ------ - - -- -------- - ----------- - ------------ - - - ---------
然后,新建一个 src/components/__tests__/Counter.spec.js
文件:
-- -------------------- ---- ------- ------ - ----- - ---- ----------------- ------ ------- ---- -------------------------- ----------------------- -- -- - -------------- --- ----- ---- --- ------ -- --------- ----- -- -- - ----- ------- - -------------- ----- ------ - ---------------------- ----------------------- ----- ---------------------- ------------------------------------- -- --
上述代码中:
mount(Counter)
模拟了一个 Counter 组件;wrapper.find()
模拟了按钮点击事件;wrapper.vm.$nextTick()
等待组件渲染完成;expect()
负责断言测试结果。
HTTP 请求的单元测试
在使用 Vue 测试时,我们不应该依赖任何实际的 API 或后端服务,因为这会让测试变得缓慢、不可预测、不稳定。
这时,我们可以使用 Jest 的 mock 功能,模拟 HTTP 请求的响应结果。
下面是一个例子。新建一个 src/services/api.js
文件:
export default { get(url) { return fetch(url).then(response => response.json()) } }
然后,新建一个 src/services/__tests__/api.spec.js
文件:
-- -------------------- ---- ------- ------ --- ---- ---------------- ----------------------- ------------------ -- -- - ------------ ------ --- -------- ------ ----- -- -- - ----- ---- - - -------- ------- ------- - ----- -------- - --- ------------------------------ --------------------------------- ----- ------ - ----- ----------------------------- ---------------------------- -- --
上述代码中,我们使用了 Jest 提供的 mock()
方法,Mock 掉了 node-fetch
方法,并返回我们自定制的响应。
封装 Jest 工具函数
在实际项目中,单元测试有很多代码模板和重复的模式,这通常会导致测试代码的可读性下降。
为了解决这个问题,我们可以封装一些 Jest 工具函数,简化测试代码的编写。
那么,什么样的工具函数可以封装呢?下面是一些建议:
createWrapper(component, options?)
:返回一个 Vue Test Utils 的包装器;mockFetch(data, status?)
:返回一条 Mock Fetch 响应数据;expectElement(wrapper, selector, value?)
:断言某个元素的存在、文本值或属性值。
下面是具体的实现。
-- -------------------- ---- ------- ------ ----- ---- ------------ ------ - ----- - ---- ----------------- ------ -------- ------------------------ ------- - --- - ------ ---------------- - ---------- -- - ------ -------- --------------- ------ - ---- - ------ --- ------------------------------ - ------- -------- - --------------- ------------------ - -- - ------ -------- ---------------------- --------- ------ - ----- ------- - ---------------------- ----------------------------------- -- ------- - ---------------------------------- - -
那么,我们就可以在测试文件中使用这些工具函数了。下面是一个例子:
-- -------------------- ---- ------- ------ - -------------- ---------- ------------- - ---- -------------- ------ ---- ---- ------------------ ----------------------- -------------------- -- -- - ----------- --- -------- --- --------- ----- -- -- - ----- ---- - - -------- ------- ------- - ---------------------------------------- ----- ------- - ------------------- ----- ---------------------- ---------------------- ----- ------- -------- -- --
总结
本文详细介绍了 Jest 在 Vue 单元测试中的应用,包括 Jest 的基础应用、Vue 组件和 HTTP 请求的单元测试、以及如何封装 Jest 工具函数来简化测试代码。希望读者在实际项目中能够合理利用单元测试提高代码质量和开发效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6475e496968c7c53b02e543c