前端组件测试中 JS 怎么 Mock 模拟父组件事件触发

浅宇小哥_5890

浅宇小哥_5890

2026-10-31

257人浏览

原创

前端组件测试中Mock父组件事件触发的核心是手动构造事件发射环境,通过mount传入jest.fn()函数模拟v-on绑定的回调,并用wrapper.emitted()或props函数验证子组件是否正确调用emit或触发事件。

前端组件测试中 js 怎么 mock 模拟父组件事件触发

在前端组件测试中,Mock 父组件事件触发的核心思路是:**不依赖真实父组件,而是手动构造事件发射环境,让子组件能接收并响应 `emit` 或 `props` 传入的函数**。Vue 测试中(尤其 Vue 3 + `<script setup>`&#65289;&#65292;&#37325;&#28857;&#22312;&#20110;&#27169;&#25311;&#29238;&#32452;&#20214;&#36890;&#36807; `v-on` &#32465;&#23450;&#30340;&#20107;&#20214;&#22238;&#35843;&#65292;&#20197;&#21450;&#39564;&#35777;&#23376;&#32452;&#20214;&#26159;&#21542;&#27491;&#30830;&#35843;&#29992;&#20102;&#36825;&#20123;&#22238;&#35843;&#12290;</script>

用 mount 配置 props 函数实现事件监听模拟

子组件通常通过 `defineEmits` 声明事件,而父组件用 `@xxx="handler"` 监听。测试时,我们反向操作——把一个 jest mock 函数作为 prop 传入,代替父组件的 handler:

  • 在 `mount()` 选项中,通过 `props` 传入一个已 `jest.fn()` 的函数,对应子组件 emit 的事件名(如 `'send'`)
  • 触发子组件内部动作(如点击按钮),检查该 mock 函数是否被调用、调用次数、参数是否正确

示例(基于你提供的代码):

// 测试 addTodo 按钮是否正确 emit 'send'

const wrapper = mount(YourComponent, {

  props: {

    msg: '1234',

    onSend: jest.fn() // 注意命名要匹配 v-on:send="..." 的写法

  }

})

await wrapper.find('.add-todo').trigger('click')

Expanso json-flatten
Expanso json-flatten

通过 CLI 或 MCP 服务器,使用 Expanso Edge 管道扁平化嵌套 JSON 对象。

下载

expect(wrapper.vm.$props.onSend).toHaveBeenCalledWith('todo内容')

处理 defineEmits + $emit 场景(推荐 Vue Test Utils 4+)

若子组件使用 `const emit = defineEmits(['send'])` 并显式调用 `emit('send', value)`,测试中无需 mock emit 本身(VTU 自动提供),只需验证它是否被调用:

  • 直接访问 `wrapper.emitted()` 获取所有已触发事件的历史记录
  • `wrapper.emitted().send` 返回数组,每个元素是某次调用的参数列表
  • 配合 `await flushPromises()` 或 `await nextTick()` 处理异步 emit

例如:

await wrapper.find('.add-todo').trigger('click')

await nextTick()

expect(wrapper.emitted().send).toHaveLength(1)

expect(wrapper.emitted().send[0]).toEqual(['新 todo'])

模拟父组件的响应式 props 变更触发子组件更新

有些子组件行为依赖父组件传入的 props 变化(比如 `v-model:xxx` 或 watch props)。这时需主动修改 wrapper 的 props 并触发更新:

  • 用 `wrapper.setProps({ msg: 'new value' })` 模拟父组件更新 props
  • 搭配 `await nextTick()` 等待 DOM 更新,再断言子组件渲染结果
  • 若子组件内有 `watch` 监听该 prop,也会被触发执行

避免常见误区

不要试图 mock `defineEmits` 或重写 `$emit` 方法——VTU 已封装好;也不要手动 new 一个父组件实例去挂载子组件,这违背单元测试“隔离性”原则。真正需要 mock 的,永远是 **父组件对子组件的输入(props 函数)和外部依赖(如 axios、localStorage)**,而非子组件自身的逻辑出口。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

javascript js 前端

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2763

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5983

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6930

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

6698

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

963

5

js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

5406

5

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

2023.07.04

1329

3

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

2023.07.04

5344

6

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

1000

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.8万人学习