Vue Test Utils 如何正确测试包含 slot 的组件?

码农含平 阅读 48

我写了一个带具名 slot 的子组件,但在用 Vue Test Utils 测试时,传入的 slot 内容好像没渲染出来,断言总是失败。是不是 mount 的时候 slot 传法不对?

这是我的组件模板:

<template>
  <div class="card">
    <header>
      <slot name="header"></slot>
    </header>
    <main>
      <slot></slot>
    </main>
  </div>
</template>
我来解答 赞 3 收藏
二维码
手机扫码查看
1 条解答
Des.星瑶
这个问题的关键是理解如何在 Vue Test Utils 中正确传递和渲染具名 slot 内容。当你使用 mount 函数挂载组件时,可以通过 slots 选项来传递 slot 内容。对于具名 slot,你需要在 slots 对象中指定具名。

首先,确保你的组件模板正确设置了具名 slot 和默认 slot。你已经做了这一步,看起来没问题。

接下来,让我们看看如何在测试中正确传递这些 slot 内容。这里有一个完整的测试示例:

pre class="pure-highlightjs line-numbers">import { mount } from '@vue/test-utils'
import CardComponent from '@/components/CardComponent.vue'

describe('CardComponent', () => {
it('renders content for default and named slots', () => {
// 使用 mount 函数挂载组件,并通过 slots 选项传递内容
const wrapper = mount(CardComponent, {
slots: {
header: '

Test Header

', // 传递给具名 slot "header" 的内容
default: '

Test Main Content

' // 传递给默认 slot 的内容
}
})

// 断言具名 slot 是否正确渲染
expect(wrapper.find('header h1').text()).toBe('Test Header')

// 断言默认 slot 是否正确渲染
expect(wrapper.find('main p').text()).toBe('Test Main Content')
})
})
/code>

在这个例子中,我们做了以下几步:

1. 使用 mount 函数挂载 CardComponent
2. 在 slots 选项中,我们为具名 slot header 传递了

Test Header

,并且为默认 slot 传递了

Test Main Content


3. 使用 wrapper.find 方法查找渲染后的 DOM 元素,检查文本内容是否符合预期。

这样,测试就能正确地验证组件中的 slot 是否按照预期渲染了。如果断言仍然失败,请检查是否有其他因素影响了渲染,比如 CSS 样式导致元素不可见等。不过通常情况下,以上方法应该可以解决大部分 slot 渲染测试的问题。
点赞
2026-03-24 11:03