条件渲染
Vue 测试工具具有一系列功能,用于渲染组件并对组件状态进行断言,目的是验证组件的行为是否正确。本文将探讨如何渲染组件,以及如何验证组件是否正确渲染内容。
本文也以 短视频 的形式提供。
查找元素
Vue 最基本的功能之一是使用 v-if 动态插入和删除元素。让我们看看如何测试使用 v-if 的组件。
const Nav = {
template: `
<nav>
<a id="profile" href="/profile">My Profile</a>
<a v-if="admin" id="admin" href="/admin">Admin</a>
</nav>
`,
data() {
return {
admin: false
}
}
}在 <Nav> 组件中,显示了指向用户个人资料的链接。此外,如果 admin 值为 true,我们将显示指向管理部分的链接。有三种情况我们应该验证其行为是否正确
- 应该显示
/profile链接。 - 当用户是管理员时,应该显示
/admin链接。 - 当用户不是管理员时,不应显示
/admin链接。
使用 get()
wrapper 有一个 get() 方法,用于搜索现有元素。它使用 querySelector 语法。
我们可以使用 get() 断言个人资料链接的内容
test('renders a profile link', () => {
const wrapper = mount(Nav)
// Here we are implicitly asserting that the
// element #profile exists.
const profileLink = wrapper.get('#profile')
expect(profileLink.text()).toEqual('My Profile')
})如果 get() 没有返回与选择器匹配的元素,它将引发错误,并且您的测试将失败。如果找到元素,get() 将返回一个 DOMWrapper。DOMWrapper 是 DOM 元素的薄包装器,它实现了 包装器 API - 这就是为什么我们可以执行 profileLink.text() 并访问文本的原因。您可以使用 element 属性访问原始元素。
还有另一种类型的包装器 - VueWrapper - 它从 getComponent 返回,其工作方式相同。
使用 find() 和 exists()
get() 假设元素存在,并在元素不存在时抛出错误。不建议将其用于断言存在。
为此,我们使用 find() 和 exists()。下一个测试断言,如果 admin 为 false(默认情况下为 false),则管理链接不存在
test('does not render an admin link', () => {
const wrapper = mount(Nav)
// Using `wrapper.get` would throw and make the test fail.
expect(wrapper.find('#admin').exists()).toBe(false)
})请注意,我们正在调用 .find() 返回的值上的 exists()。find() 与 mount() 一样,也返回一个 wrapper。mount() 有几个额外的函数,因为它包装了 Vue 组件,而 find() 只返回一个普通的 DOM 节点,但许多函数在两者之间共享。一些其他函数包括 classes(),它获取 DOM 节点具有的类,以及用于模拟用户交互的 trigger()。您可以在 此处 找到支持的函数列表。
使用 data
最后的测试是断言当 admin 为 true 时渲染管理链接。它默认情况下为 false,但我们可以使用 mount() 的第二个参数(挂载选项)来覆盖它。
对于 data,我们使用恰如其分的 data 选项
test('renders an admin link', () => {
const wrapper = mount(Nav, {
data() {
return {
admin: true
}
}
})
// Again, by using `get()` we are implicitly asserting that
// the element exists.
expect(wrapper.get('#admin').text()).toEqual('Admin')
})如果您在 data 中有其他属性,请不要担心 - Vue 测试工具将合并这两个属性。挂载选项中的 data 将优先于任何默认值。
检查元素可见性
有时您只想隐藏/显示元素,同时将其保留在 DOM 中。Vue 为此类场景提供了 v-show。(您可以查看 此处 v-if 和 v-show 之间的区别)。
以下是使用 v-show 的组件示例
const Nav = {
template: `
<nav>
<a id="user" href="/profile">My Profile</a>
<ul v-show="shouldShowDropdown" id="user-dropdown">
<!-- dropdown content -->
</ul>
</nav>
`,
data() {
return {
shouldShowDropdown: false
}
}
}在这种情况下,元素不可见,但始终渲染。get() 或 find() 将始终返回一个 Wrapper - find() 与 .exists() 一直返回 true - 因为元素仍然在 DOM 中。
使用 isVisible()
isVisible() 提供了检查隐藏元素的能力。特别是 isVisible() 将检查以下内容
- 元素或其祖先是否具有
display: none、visibility: hidden、opacity :0样式 - 元素或其祖先是否位于折叠的
<details>标签内 - 元素或其祖先是否具有
hidden属性
对于所有这些情况,isVisible() 返回 false。
使用 v-show 测试场景将如下所示
test('does not show the user dropdown', () => {
const wrapper = mount(Nav)
expect(wrapper.get('#user-dropdown').isVisible()).toBe(false)
})结论
- 使用
find()以及exists()来验证元素是否在 DOM 中。 - 如果您希望元素在 DOM 中,请使用
get()。 data挂载选项可用于设置组件的默认值。- 使用
get()与isVisible()来验证 DOM 中元素的可见性