Nuxt JS项目Vee Validate3环境下Jest无法找到ValidationProvider内选择器
问题原因
测试环境未注册ValidationProvider、ValidationMessage两个VeeValidate组件,导致组件内的validation-provider被当做未知自定义元素处理,其内部插槽内容不会被渲染,所以无法查询到嵌套在内部的目标元素。你的jest配置本身没有问题,只需要调整测试用例代码即可。
解决方案
分两种方案按需选择:
方案1:注册VeeValidate组件(适合需要测试验证逻辑的场景)
修改测试文件tests/unit/TestComponent.spec.js,代码如下:
import { mount, createLocalVue } from '@vue/test-utils' import flushPromises from 'flush-promises'; import { ValidationProvider, ValidationMessage } from 'vee-validate' import TestComponent from '@/components/TestComponent' // 创建局部Vue实例,注册VeeValidate组件 const localVue = createLocalVue() localVue.component('ValidationProvider', ValidationProvider) localVue.component('ValidationMessage', ValidationMessage) describe('TestComponent', () => { test('is a Vue instance', () => { const wrapper = mount(TestComponent, { localVue }) expect(wrapper.vm).toBeTruthy() }) test('terms are available for selection', async () => { const wrapper = mount(TestComponent, { localVue }) await flushPromises() const terms = wrapper.findAll('.jest__datasets-terms') expect(terms.exists()).toBe(true) }) })
方案2:模拟ValidationProvider组件(适合仅测试UI渲染、不需要验证逻辑的场景)
不需要引入VeeValidate,直接在mount时配置stubs参数,让模拟的组件保留插槽内容渲染:
import { mount } from '@vue/test-utils' import flushPromises from 'flush-promises'; import TestComponent from '@/components/TestComponent' describe('TestComponent', () => { test('is a Vue instance', () => { const wrapper = mount(TestComponent, { stubs: { // 模拟ValidationProvider,直接渲染插槽内容 ValidationProvider: { template: '<div><slot /></div>' }, // 模拟ValidationMessage,避免未知组件报错 ValidationMessage: { template: '<span />' } } }) expect(wrapper.vm).toBeTruthy() }) test('terms are available for selection', async () => { const wrapper = mount(TestComponent, { stubs: { ValidationProvider: { template: '<div><slot /></div>' }, ValidationMessage: { template: '<span />' } } }) await flushPromises() const terms = wrapper.findAll('.jest__datasets-terms') expect(terms.exists()).toBe(true) }) })
两种方案都可以让你正常查询到validation-provider内部的元素。
内容的提问来源于stack exchange,提问作者Ryan H
相关产品推荐
相关产品推荐

