You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue Test Utils无法渲染Element Plus模板插槽内容的问题

问题:Element Plus组件测试中无法渲染具名插槽内容到快照

在测试基于Element Plus的组件时,发现快照无法渲染<template #dropdown>中的内容,相关代码及现象如下:

测试代码(example.spec.js)

import { ElementPlus } from 'element-plus'
import { createI18n } from 'vue-i18n'
import { mount } from '@vue/test-utils'
import store from '@/store/index'
import TTT from '../../../TTT.vue'

const i18n = createI18n({
  // vue-i18n options here ...
})

describe('test', () => {
  const wrapper = mount(TTT, {
    global: {
      plugins: [ElementPlus, i18n, store],
    },
  })
  expect(wrapper)
  test('snapShot', () => {
    expect(wrapper.element).toMatchSnapshot()
  })
})

组件代码(TTT.vue)

<template>
  <el-dropdown class="me-3" :hide-timeout="0" :show-timeout="0">
    <span class="el-dropdown-link h-100">
      <a href="#" class="px-4 py-3 text-white font-18" @click.prevent><font-awesome-icon class="font1R6" icon="earth-americas" /></a>
    </span>
    <template #dropdown>
      <el-dropdown-menu>
        <el-dropdown-item @click.prevent="handleChangeLanguage(item.value)"> 123 </el-dropdown-item>
      </el-dropdown-menu>
    </template>
  </el-dropdown>
</template>

生成的快照

exports[`test snapShot 1`] = `
<el-dropdown
  class="me-3"
  hide-timeout="0"
  show-timeout="0"
>
  <span
    class="el-dropdown-link h-100"
  >
    <a
      class="px-4 py-3 text-white font-18"
      href="#"
    >
      <font-awesome-icon
        class="font1R6"
        icon="earth-americas"
      />
    </a>
  </span>
</el-dropdown>
`;

尝试将<template #dropdown>改为<slot name="dropdown">后,快照能显示内容,但网站运行报错。


解决方案

1. 触发下拉菜单展开状态

Element Plus的el-dropdown默认隐藏下拉面板,测试时需主动触发展开,才能让插槽内容渲染到DOM中。可以通过触发下拉按钮的点击事件实现:

修改测试代码如下:

describe('test', () => {
  let wrapper;
  beforeEach(() => {
    wrapper = mount(TTT, {
      global: {
        plugins: [ElementPlus, i18n, store],
      },
    });
  });

  test('snapShot', async () => {
    // 触发下拉按钮点击,展开菜单
    await wrapper.find('.el-dropdown-link').trigger('click');
    // 等待DOM更新完成
    await wrapper.vm.$nextTick();
    expect(wrapper.element).toMatchSnapshot();
  });
});

2. 处理异步更新

触发点击后DOM更新是异步操作,必须使用await等待$nextTick或waitFor,确保快照捕获到展开后的状态。

3. 保留原组件的插槽写法

不要修改<template #dropdown>的写法,<slot name="dropdown">是在当前组件定义插槽,而非向el-dropdown传递插槽内容,这会导致生产环境报错,必须保持原写法不变。


内容的提问来源于stack exchange,提问作者louis wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:50:20