Vue+Jest 单元测试

这篇博客探讨了在Vue项目中使用Jest进行单元测试的常见场景,包括挂载组件、模拟函数、测试接口、watch、computed属性以及处理方法。文章提到了jest.fn()、jest.mock()和jest.spyOn()在不同情况下的应用,并提醒读者在测试中有条件显示的组件和触发按钮事件的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新到一个公司,要求单元测试覆盖率达50%以上,我们都是后补的单测,其实单测的意义是根据需求提前写好,驱动开发,代替手动测试。然鹅这只是理想。。。

这里总结一下各种遇到的单测场景

  1. 挂载组件,调用elementui, mock函数
```javascript

describe('页面验证', () => {
   
   
	const wrapper = getVue({
   
   
	    component: onlineFixedPrice,
	    callback(Vue) {
   
   
	      Vue.use(elementUi)
	    },
	    mocks: {
   
   
		  $route: {
   
   
	        query: {
   
   
	          id: '13945416091902200'
	        }
	      },
	      $store: {
   
   
	        state: {
   
   
	          name: 'meimei'
	        }
	      },
	      $refs: {
   
   
	        form: {
   
   
	          height: 300
	        }
	      },
	      $message: {
   
   
	        error() {
   
   
	          return jest.fn()
	        }
	      }
		}
	})
}
  1. 测试接口:
    jest.fn(),jest.mock()和jest.spyOn(), 都能创建mock函数,在实际项目的单元测试中:
    1)jest.fn()常被用来进行某些有回调函数的测试;
    2)jest.mock()可以mock整个模块中的方法,当某个模块已经被单元测试100%覆盖时,使用jest.mock()去mock该模块,节约测试时间和测试的冗余度是十分必要;
    3)当需要测试某些必须被完整执行的方法时,常常需要使用jest.spyOn()。
    这些都需要根据实际的业务代码灵活选择
```javascript

<!-- hello.js -->
<script>
methods: {
   
   
	sayHello() {
   
   
		this.$refs.form.validate(valid => {
   
   
			this.axios('getName', {
   
   id: '123'}, ()=> {
   
   
				this.name = res.data.name
			})
		})
	}
}
</script>


<!-- hello
### 如何在 Vue3 项目中使用 Jest 进行单元测试 #### 安装依赖 为了在 Vue3 项目中使用 Jest 进行单元测试,首先需要安装必要的依赖项。这些依赖包括 `jest`、`@vue/test-utils` 和其他支持工具。 以下是所需的命令: ```bash npm install --save-dev jest @vue/test-utils@next vue-jest @babel/core @babel/preset-env babel-jest jest-environment-jsdom ``` 注意:对于 Vue3 的兼容性,请确保安装的是 `@vue/test-utils` 的最新版本(通常标记为 `next`),因为旧版可能不完全支持 Vue3[^1]。 --- #### 配置 Babel 由于 Jest 默认无法解析 Vue 文件中的模板语法,因此需要配置 Babel 来处理 `.vue` 文件。创建或更新项目的 `babel.config.js` 文件: ```javascript module.exports = { presets: [ ['@babel/preset-env', { targets: { node: 'current' } }] ], plugins: [] }; ``` 同时,在根目录下创建一个 `vue-jest-transform.config.js` 文件来定义 Vue 文件的转换规则: ```javascript module.exports = { transform: { '^.+\\.vue$': 'vue-jest' } }; ``` 最后,在 `package.json` 中添加以下字段以指定 Jest 的配置文件路径: ```json { "jest": { "transform": { ".*\\.(vue)$": "<rootDir>/node_modules/vue-jest", ".+\\.(js|jsx|mjs|cjs|ts|tsx)$": "<rootDir>/node_modules/babel-jest" }, "testEnvironment": "jsdom" } } ``` --- #### 创建组件 假设有一个简单的 Vue3 组件 `MyComponent.vue`: ```html <template> <div class="my-component"> Hello, {{ name }}! </div> </template> <script> export default { name: 'MyComponent', props: { name: String } }; </script> ``` --- #### 编写测试用例 接下来为该组件编写测试用例。创建一个名为 `MyComponent.spec.js` 的文件: ```javascript import { mount } from '@vue/test-utils'; import MyComponent from '@/components/MyComponent.vue'; describe('MyComponent.vue', () => { it('renders the correct message with a prop', async () => { const wrapper = mount(MyComponent, { props: { name: 'World' } }); expect(wrapper.text()).toContain('Hello, World!'); }); }); ``` 在这个例子中,我们使用了 `mount` 方法加载组件并传递了一个 `name` 属性作为道具。随后通过断言验证渲染的内容是否符合预期[^2]。 --- #### 执行测试 完成上述步骤后,可以通过运行以下命令执行测试: ```bash npx jest ``` 如果一切正常,你应该会看到测试成功的结果输出。 --- #### 常见问题解决 1. **JSDOM 环境错误** 如果遇到与 DOM 操作相关的问题,可以尝试升级 `jest-environment-jsdom` 或者调整其配置。 2. **Vue 版本冲突** 确保使用的 `@vue/test-utils` 是针对 Vue3 设计的版本(即带有 `next` 标签)。否则可能会引发 API 不匹配等问题[^3]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值