0Pricing
Vue Academy · 课时

挂载与查询组件

mount()、shallowMount()、wrapper.find()、wrapper.findAll()、getByText(),以及 data-testid

挂载与查询组件 是 CoddyKit 上的免费 Vue Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Vue Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Vue Academy 课程共包含 4 节课。

在测试中渲染组件

要测试组件,您必须将它渲染到 jsdom DOM 中,然后检查结果。@vue/test-utils 提供了 mount 以及带有查询辅助方法的 wrapper 对象。

mount:完整渲染

mount 会真实渲染组件以及它的所有子组件。当行为取决于子组件是否渲染出实际内容时,请使用它。

import { mount } from "@vue/test-utils"
import Card from "./Card.vue"

const wrapper = mount(Card, {
  props: { title: "Hello" },
})

shallowMount:替换子组件

shallowMount 会渲染组件,但会用轻量级替身替换子组件。这样可以将待测试单元与子组件的内部实现隔离开来。

import { shallowMount } from "@vue/test-utils"
import Page from "./Page.vue"

const wrapper = shallowMount(Page)
// child components appear as <child-stub />

mount 与 shallowMount

请根据目的进行选择:

  • mount——集成测试风格;您关注子组件如何渲染。
  • shallowMount——单元测试风格;您只测试当前组件的逻辑和模板。

浅层挂载速度更快,也能避免子组件缺陷引发级联失败。

find:可选匹配

wrapper.find(selector) 接受一个 CSS 选择器并返回一个 wrapper。如果没有匹配项,结果的 exists() 会是 false,而不会抛出异常。

const title = wrapper.find("h1")
expect(title.exists()).toBe(true)
expect(title.text()).toBe("Hello")

get:必需匹配

wrapper.get(selector) 类似于 find,但如果元素不存在就会抛出异常。当元素必须存在时请使用它——这里的错误消息比稍后访问空值更清晰。

const button = wrapper.get("button.submit")
// throws immediately with a helpful message if absent

选择 find 还是 get

对于应该始终存在的元素,请使用 get(并断言其内容)。当您测试元素是否存在时,请使用 find,例如只在某些情况下渲染的错误提示。

expect(wrapper.find(".error").exists()).toBe(false)

const label = wrapper.get("label")
expect(label.text()).toBe("Email")

findAll:多个元素

wrapper.findAll(selector) 会返回一个 wrapper 数组,其中包含每个匹配项。它非常适合断言列表长度和遍历各行。

const items = wrapper.findAll("li")
expect(items).toHaveLength(3)
expect(items[0].text()).toBe("First")

使用 text() 读取文本

wrapper.text() 会返回元素及其子元素经过首尾空白裁剪并拼接后的文本内容。它非常适合断言可见文本,而不必关注精确的标记结构。

expect(wrapper.text()).toContain("3 results found")

使用 html() 检查标记

wrapper.html() 会返回渲染后的 HTML 字符串。调试失败的测试,或断言属性和结构时,它都很有用。

console.log(wrapper.html())
// <div class="card"><h1>Hello</h1></div>
expect(wrapper.html()).toContain("class=\"card\"")

查找子组件

除了 CSS 选择器之外,find 和 findComponent 还接受组件引用,用于定位特定的子组件实例。

import { findComponent } from "@vue/test-utils"
import Avatar from "./Avatar.vue"

const avatar = wrapper.findComponent(Avatar)
expect(avatar.exists()).toBe(true)

快速检查

检查您对使用测试工具进行查询的理解。

回顾

您学会了如何渲染和查询组件:

  • mount 会真实渲染子组件;shallowMount 会用替身替换它们,以实现隔离。
  • find 返回可能为空的 wrapper;找不到元素时,get 会抛出异常。
  • findAll 会为列表返回一个数组。
  • text() 读取可见文本;html() 返回渲染后的标记。
  • findComponent 定位特定的子组件。

常见问题解答

「挂载与查询组件」课时是免费的吗?

是的 — 「挂载与查询组件」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Vue Academy 课程的其余内容,请升级到 CoddyKit PRO。 Vue Academy 课程共包含 4 节课。

「挂载与查询组件」这节课中我会学到什么?

mount()、shallowMount()、wrapper.find()、wrapper.findAll()、getByText(),以及 data-testid 你通过在浏览器中直接运行的动手代码来练习 Vue Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Vue Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Vue Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「挂载与查询组件」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Vue Academy 课中编写并运行代码吗?

能。每节 Vue Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 为 Vue 项目配置 Vitest
  2. 挂载与查询组件
  3. 测试用户交互与事件
  4. 模拟组合式函数、存储与 API
← 返回 Vue Academy