Jest测试Vue3+TS+Quasar项目报Cannot read property 'deep' of undefined错误
错误原因
该报错本质是Jest测试运行环境未正确处理Vue3的深度样式选择器编译逻辑,导致运行时尝试读取不存在的deep内置指令属性,具体触发原因包括三种:
- 项目依赖的
vue、@vue/test-utils、Vue Jest转换插件版本不匹配,无法正确识别深度选择器语法 - 使用了废弃的深度选择器写法(如
::v-deep、/deep/), Jest转换插件未做兼容处理,将其识别为普通自定义指令 - Quasar框架的样式相关能力未在Jest测试初始化逻辑中注册,导致相关指令加载失败
解决方案
按以下步骤依次排查修复:
- 对齐依赖版本:确保
vue、@vue/test-utils@2.x、@vue/vue3-jest三个依赖的大版本完全匹配,比如vue为3.3.x时,@vue/vue3-jest也要使用3.3.x版本 - 统一深度选择器写法:将所有旧写法替换为Vue3标准语法
:deep(目标选择器),比如把::v-deep .el-button改为:deep(.el-button) - 修正Jest配置:在
jest.config.js中补充如下适配Vue3+TS的配置:
module.exports = { transform: { "^.+\\.vue$": "@vue/vue3-jest", "^.+\\.ts$": "ts-jest" }, testEnvironment: "jsdom", testEnvironmentOptions: { customExportConditions: ["node", "node-addons"] } }
- 注册Quasar测试插件:在Jest初始化文件(通常为
jest.setup.ts)中引入Quasar测试工具的注册逻辑:
import { installQuasarPlugin } from "@quasar/quasar-app-extension-testing-unit-jest"; installQuasarPlugin();
- 兜底mock方案:如果以上步骤都无效,可以在挂载组件时全局mock
deep指令即可,单测不需要实际处理样式逻辑:
import { mount } from "@vue/test-utils"; import TestComponent from "@/modules/d.vue"; const wrapper = mount(TestComponent, { global: { directives: { deep: { mounted: () => {} } } } });
内容的提问来源于stack exchange,提问作者harshita
相关产品推荐
相关产品推荐

