vue-test-utils提示find未返回#txtForget无法调用setValue()如何解决
报错原因
该报错[vue-test-utils]: find did not return #txtForget, cannot call setValue() on empty Wrapper核心原因是执行find操作时,DOM中不存在id为txtForget的节点,具体触发场景有以下几种:
- 模态框默认未激活:你要操作的输入框放在模态框内部,Vuetify的
v-dialog组件默认未打开时不会将内部内容挂载到DOM树,测试代码没有主动触发模态框显示的逻辑,自然找不到内部元素 - 未等待异步渲染完成:
v-text-field、ValidationProvider都带有异步渲染逻辑,组件挂载后直接同步查找元素,节点还未完成渲染就执行了find操作 - 子组件Stub丢失属性:如果你的测试配置全局Stub了
v-text-field或者ValidationProvider,会导致原始组件上的id属性没有透传到渲染后的节点,按id查找自然失败 - 模态框挂载上下文异常:Vuetify的模态框默认会挂载到body节点下,如果测试时没有把组件挂载到真实DOM上下文,也会出现查找失效的问题
解决方法
按顺序检查调整以下测试逻辑即可:
- 主动触发模态框打开,等待DOM更新后再查找元素
test("RESET PASSWORD test", async () => { // 提前创建挂载节点,解决Vuetify组件上下文问题 const el = document.createElement('div') document.body.appendChild(el) let wrapper = mount(Login, { stubs: { "router-link": true, "router-view": true, // 明确不要Stub这两个组件,保证id属性透传 "v-text-field": false, "ValidationProvider": false }, vuetify, router, localVue, attachTo: el }); // 替换成你的模态框绑定的v-model变量名,主动打开模态框 wrapper.vm.showForgetPwdModal = true // 等待异步渲染完成 await wrapper.vm.$nextTick() wrapper.vm.editedItem.email = "admin@gmail.com"; let element_textbox = wrapper.find("#txtForget"); // 先校验元素是否存在,避免空操作报错 expect(element_textbox.exists()).toBe(true) await element_textbox.setValue("test@gmail.com"); // 修正断言逻辑:setValue后v-model绑定值会更新为新输入的内容 expect(wrapper.vm.editedItem.email).toBe("test@gmail.com"); // 测试完成后销毁节点,避免污染其他用例 wrapper.destroy() el.remove() });
内容的提问来源于stack exchange,提问作者Mohamed Raza
相关产品推荐
相关产品推荐

