1
1
# 条件渲染
2
2
3
- Vue Test Utils 提供了一系列功能,用于渲染组件并对其状态进行断言,以验证其是否正常工作。本文将探讨如何渲染组件,以及验证它们是否正确渲染内容 。
3
+ Vue Test Utils 提供了一系列功能,用于渲染组件并对其状态进行断言,以验证其是否正常工作。本文将探讨如何渲染组件,以及如何验证组件是否正确渲染内容 。
4
4
5
- 本文也可以作为 [ 短视频] ( https://www.youtube.com/watch?v=T3CHtGgEFTs&list=PLC2LZCNWKL9ahK1IoODqYxKu5aA9T5IOA&index=15 ) 观看 。
5
+ 这篇文章也提供了 [ 短视频] ( https://www.youtube.com/watch?v=T3CHtGgEFTs&list=PLC2LZCNWKL9ahK1IoODqYxKu5aA9T5IOA&index=15 ) 版本 。
6
6
7
7
## 查找元素
8
8
9
- Vue 的基本特性之一是能够动态插入和移除元素,使用 ` v-if ` 指令。让我们看看如何测试一个使用 ` v-if ` 的组件。
9
+ Vue 最基础的特性之一是能够使用 ` v-if ` 动态地插入和移除元素。让我们看看如何测试一个使用了 ` v-if ` 的组件。
10
10
11
11
``` js
12
12
const Nav = {
@@ -24,55 +24,55 @@ const Nav = {
24
24
}
25
25
```
26
26
27
- 在 ` <Nav> ` 组件中,显示用户个人资料的链接 。此外,如果 ` admin ` 的值为 ` true ` ,则会显示指向管理员部分的链接。我们需要验证的三个场景是 :
27
+ 在 ` <Nav> ` 组件中,我们首先显示指向个人资料的链接 。此外,如果 ` admin ` 的值为 ` true ` ,我们还会显示指向管理中心的链接。这里有三个我们需要验证的场景 :
28
28
29
- 1 . 应该显示 ` /profile ` 链接。
30
- 2 . 当用户是管理员时,应该显示 ` /admin ` 链接。
31
- 3 . 当用户不是管理员时,应该不显示 ` /admin ` 链接。
29
+ 1 . 显示 ` /profile ` 链接。
30
+ 2 . 当用户是管理员时,显示 ` /admin ` 链接。
31
+ 3 . 当用户不是管理员时,不显示 ` /admin ` 链接。
32
32
33
33
## 使用 ` get() `
34
34
35
- ` wrapper ` 有一个 ` get() ` 方法,用于查找现有元素 。它使用 [ ` querySelector ` ] ( https://developer.mozilla.org/en-US /docs/Web/API/Document/querySelector ) 语法。
35
+ ` wrapper ` 有一个 ` get() ` 方法,用于查找存在的元素 。它使用 [ ` querySelector ` ] ( https://developer.mozilla.org/zh-CN /docs/Web/API/Document/querySelector ) 语法。
36
36
37
- 我们可以使用 ` get() ` 来断言 ` / profile` 链接的内容 :
37
+ 我们可以使用 ` get() ` 来断言 profile 链接的文本内容 :
38
38
39
39
``` js
40
40
test (' renders a profile link' , () => {
41
41
const wrapper = mount (Nav)
42
42
43
- // 在这里,我们隐含地断言元素 #profile 存在 。
43
+ // 这里我们隐式断言 #profile 元素存在 。
44
44
const profileLink = wrapper .get (' #profile' )
45
45
46
46
expect (profileLink .text ()).toEqual (' My Profile' )
47
47
})
48
48
```
49
49
50
- 如果 ` get() ` 不返回与选择器匹配的元素,它将引发错误,测试将失败。如果找到元素 ,` get() ` 返回一个 ` DOMWrapper ` 。` DOMWrapper ` 是对 DOM 元素的一个薄包装,支持 [ Wrapper API] ( ../../api/#Wrapper-methods ) - 这就是我们能够使用 ` profileLink.text() ` 访问文本的原因。你可以使用 ` element ` 属性访问原始元素。
50
+ 如果 ` get() ` 没有找到匹配选择器的元素,它会抛出错误,测试将会失败。如果找到了元素 ,` get() ` 返回一个 ` DOMWrapper ` 。` DOMWrapper ` 是一个轻量级的 DOM 元素包装,它实现了 [ Wrapper API] ( ../../api/#Wrapper-methods ) ,这就是为什么我们能够使用 ` profileLink.text() ` 来访问文本内容。你可以通过 ` element ` 属性访问原始元素。
51
51
52
- 还有另一种类型的包装器 - ` VueWrapper ` - 它是从 [ ` getComponent ` ] ( ../../api/#getComponent ) 返回的 ,工作方式相同。
52
+ 还有另一种封装类型: ` VueWrapper ` ,它由 [ ` getComponent ` ] ( ../../api/#getComponent ) 返回 ,工作方式相同。
53
53
54
54
## 使用 ` find() ` 和 ` exists() `
55
55
56
- ` get() ` 假设元素存在,并在不存在时抛出错误 。因此,不建议使用它来断言元素的存在 。
56
+ ` get() ` 基于元素存在的假设来工作,当元素不存在时会抛出错误 。因此,不推荐使用它来断言元素是否存在 。
57
57
58
- 为此,我们使用 ` find() ` 和 ` exists() ` 。下一个测试断言如果 ` admin ` 为 ` false ` ( 默认值),则管理员链接不存在 :
58
+ 为此,我们使用 ` find() ` 和 ` exists() ` 。下面的测试用例断言:如果 ` admin ` 为 ` false ` ( 默认值),admin 链接不会出现 :
59
59
60
60
``` js
61
61
test (' does not render an admin link' , () => {
62
62
const wrapper = mount (Nav)
63
63
64
- // 使用 `wrapper.get` 会抛出错误并使测试失败 。
64
+ // 使用 `wrapper.get` 会抛出错误并导致测试失败 。
65
65
expect (wrapper .find (' #admin' ).exists ()).toBe (false )
66
66
})
67
67
```
68
68
69
- 请注意,我们在 ` .find() ` 返回的值上调用 ` exists() ` 。` find() ` 和 ` mount() ` 一样,也返回一个 ` wrapper ` 。` mount() ` 有一些额外的方法,因为它包装的是 Vue 组件,而 ` find() ` 仅返回常规 DOM 节点,但两者之间共享许多方法。其他方法包括 ` classes() ` ,用于获取 DOM 节点的类,以及 ` trigger() ` ,用于模拟用户交互 。你可以在[ 这里] ( ../../api/#Wrapper-methods ) 找到支持的方法列表。
69
+ 请注意,我们在 ` .find() ` 返回的值上调用了 ` exists() ` 。` find() ` 和 ` mount() ` 一样,也会返回一个 ` wrapper ` 。` mount() ` 有一些额外的方法,因为它包装的是 Vue 组件,而 ` find() ` 只返回普通的 DOM 节点,但它们之间有许多共享的方法。其他方法还包括 ` classes() ` ,用于获取 DOM 节点的 class 属性,以及用于模拟用户交互的 ` trigger() ` 。你可以在[ 这里] ( ../../api/#Wrapper-methods ) 找到支持的方法列表。
70
70
71
71
## 使用 ` data `
72
72
73
- 最后一个测试是断言当 ` admin ` 为 ` true ` 时,管理员链接被渲染。它默认是 ` false ` ,但我们可以使用 ` mount() ` 的第二个参数,即[ 挂载选项] ( ../../api/#mount ) 来覆盖它。
73
+ 最后一个测试是断言当 ` admin ` 为 ` true ` 时,会渲染 admin 链接。它的默认值是 ` false ` ,但我们可以使用 ` mount() ` 的第二个参数,即[ 挂载选项] ( ../../api/#mount ) 来覆盖它。
74
74
75
- 对于 ` data ` ,我们使用命名恰当的 ` data ` 选项:
75
+ 对于 ` data ` ,我们使用恰如其名的 ` data ` 选项:
76
76
77
77
``` js
78
78
test (' renders an admin link' , () => {
@@ -84,18 +84,18 @@ test('renders an admin link', () => {
84
84
}
85
85
})
86
86
87
- // 通过使用 `get()` 我们隐含地断言元素存在 。
87
+ // 同样,使用 `get()` 时我们隐式地断言了元素存在 。
88
88
expect (wrapper .get (' #admin' ).text ()).toEqual (' Admin' )
89
89
})
90
90
```
91
91
92
- 如果你在 ` data ` 中有其他属性 ,不用担心 - Vue Test Utils 会将两者合并。挂载选项中的 ` data ` 将优先于任何默认值 。
92
+ 如果你在 ` data ` 中还有其他属性 ,不用担心, Vue Test Utils 会将两者合并。挂载选项中的 ` data ` 会优先于任何默认值 。
93
93
94
94
要了解其他挂载选项,请参见[ 传递数据] ( ../essentials/passing-data.md ) 或[ 挂载选项] ( ../../api/#mount ) 。
95
95
96
96
## 检查元素可见性
97
97
98
- 有时你只想隐藏 /显示一个元素,同时将其保留在 DOM 中。Vue 提供了 ` v-show ` 以应对这种情况 。(你可以在[ 这里] ( https://v3 .vuejs.org/guide/conditional.html#v-if-vs-v-show ) 查阅 ` v-if ` 和 ` v-show ` 之间的区别 。)
98
+ 有时你可能只想隐藏 /显示一个元素,同时将其保留在 DOM 中。Vue 为这种场景提供了 ` v-show ` 指令 。(你可以在[ 这里] ( https://cn .vuejs.org/guide/essentials/ conditional.html#v-if-vs-v-show ) 查阅 ` v-if ` 和 ` v-show ` 的区别 。)
99
99
100
100
使用 ` v-show ` 的组件如下所示:
101
101
@@ -117,17 +117,17 @@ const Nav = {
117
117
}
118
118
```
119
119
120
- 在这种情况下,元素不可见但始终被渲染 。` get() ` 或 ` find() ` 将始终返回一个 ` Wrapper ` - ` find() ` 的 ` .exists() ` 始终返回 ` true ` - 因为 ** 元素仍然在 DOM 中 ** 。
120
+ 在这种场景下,元素虽然不可见但始终被渲染 。` get() ` 或 ` find() ` 将始终返回一个 ` Wrapper ` ——因为 ** 该元素仍然在 DOM 中 ** ,所以 ` find() ` 结合 ` .exists() ` 始终返回 ` true ` 。
121
121
122
122
## 使用 ` isVisible() `
123
123
124
- ` isVisible() ` 可以检查隐藏元素。特别是 ` isVisible() ` 将检查 :
124
+ ` isVisible() ` 提供了检查隐藏元素的能力。具体来说, ` isVisible() ` 会检查 :
125
125
126
- - 元素或其祖先是否具有 ` display: none ` 、` visibility: hidden ` 或 ` opacity: 0 ` 样式
126
+ - 元素或其祖先元素是否具有 ` display: none ` 、` visibility: hidden ` 或 ` opacity: 0 ` 样式
127
127
- 元素或其祖先是否位于折叠的 ` <details> ` 标签内
128
- - an element or its ancestors have the ` hidden ` attribute
128
+ - 元素本身或其祖先元素是否有 ` hidden ` attribute
129
129
130
- 在这些情况下 ,` isVisible() ` 将返回 ` false ` 。
130
+ 在以上任一情况下 ,` isVisible() ` 都会返回 false。
131
131
132
132
使用 ` v-show ` 进行测试的场景如下:
133
133
@@ -139,9 +139,9 @@ test('does not show the user dropdown', () => {
139
139
})
140
140
```
141
141
142
- ## 结论
142
+ ## 总结
143
143
144
- - 使用 ` find() ` 结合 ` exists() ` 验证元素是否在 DOM 中。
145
- - 如果你确认元素应该在 DOM 中,请使用 ` get() ` 。
144
+ - 使用 ` find() ` 结合 ` exists() ` 验证元素是否在于 DOM 中。
145
+ - 如果你确认元素存在于 DOM 中,就使用 ` get() ` 。
146
146
- 可以使用 ` data ` 挂载选项设置组件的默认值。
147
- - 使用 ` get() ` 和 ` isVisible() ` 验证在 DOM 中的元素的可见性 。
147
+ - 使用 ` get() ` 和 ` isVisible() ` 验证在 DOM 中元素的可见性 。
0 commit comments