Skip to content

Commit

Permalink
docs(zh): review v-model and vuex (#2617)
Browse files Browse the repository at this point in the history
* docs(zh): review v-model

* docs(zh): review vuex
  • Loading branch information
Jinjiang authored Feb 23, 2025
1 parent 74665ef commit f5f1b6c
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 34 deletions.
14 changes: 7 additions & 7 deletions docs/zh/guide/advanced/v-model.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# 测试 `v-model`

在编写依赖于 `v-model` 交互的组件时 (即 `update:modelValue` 事件),需要处理 `event``props`
在编写基于 `v-model` 交互 (即 `update:modelValue` 事件) 的组件时,你需要处理 `event``props`

可以查看 [“vmodel integration” 讨论](https://github.com/vuejs/test-utils/discussions/279)获取一些社区解决方案
查阅[“vmodel integration”讨论](https://github.com/vuejs/test-utils/discussions/279)获取一些社区的解决方案

有关 v-model 事件的更多信息,请查看 [VueJS VModel 事件文档](https://vuejs.org/guide/components/events.html#usage-with-v-model)
查阅 [VueJS VModel 事件文档](https://vuejs.org/guide/components/events.html#usage-with-v-model)

## 简单的示例

Expand All @@ -24,7 +24,7 @@ const Editor = {
}
```

这个组件将表现得像一个输入组件
这个组件表现得像一个输入组件

```js
const App = {
Expand Down Expand Up @@ -60,9 +60,9 @@ test('modelValue should be updated', async () => {

# 多个 `v-model`

在某些情况下,我们可以有多个 `v-model` 定向到特定属性
在某些情况下,我们可以通过多个 `v-model` 定向到特定的多个属性

例如在一个货币编辑器中,我们可以有 `currency``modelValue` 属性。
例如在一个货币编辑器中,我们有 `currency``modelValue` 属性。

```js
const MoneyEditor = {
Expand All @@ -75,7 +75,7 @@ const MoneyEditor = {
}
```

我们可以通过以下方式测试这两个属性
我们可以这样测试这它们

```js
test('modelValue and currency should be updated', async () => {
Expand Down
54 changes: 27 additions & 27 deletions docs/zh/guide/advanced/vuex.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# 测试 Vuex

Vuex 只是一个实现细节;在测试使用 Vuex 的组件时不需要特别处理。尽管如此,有一些技术可以使你的测试更易读和易写。我们将在这里讨论这些技术
Vuex 只是一个实现细节;在测试使用 Vuex 的组件时不需要特别处理。尽管如此,还是有一些技巧可以使你的测试更易读和易写。我们将在这里讨论它们

本指南假设你对 Vuex 已经熟悉。Vuex 4 是与 Vue.js 3 一起使用的版本。可以在[这里](https://next.vuex.vuejs.org/)阅读文档。

## 简单示例

以下是一个简单的 Vuex 存储和一个依赖于 Vuex 存储的组件
以下是一个简单的 Vuex store 和一个依赖于 Vuex store 的组件

```js
import { createStore } from 'vuex'
Expand All @@ -25,7 +25,7 @@ const store = createStore({
})
```

这个存储简单地存储了一个计数,当提交 `increment` 变更时增加计数。以下是我们将要测试的组件:
这个 store 简单地存储了一个计数,当提交 `increment` mutation 时增加计数。以下是我们将要测试的组件:

```js
const App = {
Expand All @@ -48,9 +48,9 @@ const App = {
}
```

## 使用真实的 Vuex 存储进行测试
## 使用真实的 Vuex store 进行测试

为了充分测试这个组件和 Vuex 存储的工作情况,我们将点击 `<button>` 并断言计数是否增加。在你的 Vue 应用中,通常在 `main.js` 中,你可以这样安装 Vuex:
为了充分测试这个组件和 Vuex store 的工作情况,我们将点击 `<button>` 并断言计数是否增加。在你的 Vue 应用中,通常在 `main.js` 中,你可以这样安装 Vuex:

```js
const app = createApp(App)
Expand All @@ -59,7 +59,7 @@ app.use(store)

这是因为 Vuex 是一个插件。插件通过调用 `app.use` 并传入插件来应用。

Vue Test Utils 也允许你安装插件,使用 `global.plugins` 挂载选项
Vue Test Utils 也允许你使用 `global.plugins` 挂载选项安装插件

```js
import { createStore } from 'vuex'
Expand Down Expand Up @@ -90,11 +90,11 @@ test('vuex', async () => {
})
```

在安装插件后,我们使用 `trigger` 点击按钮并断言 `count` 是否增加。这种测试覆盖了不同系统之间的交互 (在这种情况下是组件和存储),称为集成测试。
在安装插件后,我们使用 `trigger` 点击按钮并断言 `count` 是否增加。这种测试覆盖了不同系统之间的交互 (在这种情况下是组件和 store),称为集成测试。

## 使用模拟存储进行测试
## 使用模拟 store 进行测试

相比之下,单元测试可能会将组件和存储分开进行测试。如果你有一个非常大的应用程序和复杂的存储,这可能会很有用。对于这种用例,你可以使用 `global.mocks` 模拟你感兴趣的存储部分
相比之下,单元测试可能会将组件和 store 分开进行测试。如果你有一个非常大的应用程序和复杂的 store ,这可能会很有用。对于这种用例,你可以使用 `global.mocks` 模拟这个 store 中你感兴趣的部分:

```js
test('vuex using a mock store', async () => {
Expand All @@ -119,13 +119,13 @@ test('vuex using a mock store', async () => {
})
```

我们没有使用真实的 Vuex 存储并通过 `global.plugins` 安装它,而是创建了自己的模拟存储,仅实现了组件中使用的 Vuex 部分 (在这种情况下是 `state``commit` 函数)。
相较于使用真实的 Vuex store 并通过 `global.plugins` 安装它,取而代之的是,我们创建了自己的模拟 store,仅实现了 Vuex 用在该组件中的部分 (在这种示例中是 `state``commit` 函数)。

虽然在隔离中测试存储似乎很方便,但请注意,如果你破坏了 Vuex 存储,它不会给你任何警告。请仔细考虑是否要模拟 Vuex 存储,或者使用真实的存储,并理解其中的权衡。
虽然隔离测试 store 似乎很方便,但请注意,如果你破坏了 Vuex store 是不会收到任何警告的。请仔细考虑要模拟 Vuex store 还是使用真实的 store,并理解其中的权衡。

## 独立测试 Vuex
## 隔离测试 Vuex

你可能希望完全独立地测试你的 Vuex 变更或动作,特别是如果它们很复杂。你不需要 Vue Test Utils,因为 Vuex 存储只是常规的 JavaScript。以下是如何在没有 Vue Test Utils 的情况下测试 `increment` 变更
你可能希望完全隔离测试你的 Vuex mutation 或 action,特别是当它们很复杂时。因为 Vuex store 只是常规的 JavaScript,所它需要 Vue Test Utils。以下是不通过 Vue Test Utils 测试 `increment` mutation 的方式

```js
test('increment mutation', () => {
Expand All @@ -146,9 +146,9 @@ test('increment mutation', () => {
})
```

## 预设 Vuex 状态
## 预设 Vuex state

有时在测试中将 Vuex 存储设置为特定状态是有用的。除了 `global.mocks`你可以使用创建一个包装 `createStore` 的函数,并接受一个参数来设置初始状态。在这个示例中,我们扩展 `increment` 以接受一个附加参数,该参数将添加到 `state.count` 上。如果未提供该参数,我们只将 `state.count` 增加 1。
有时在特定的状态下获得 Vuex store 是对测试非常有帮助的。除了 `global.mocks`我们还有一个技巧,就是创建一个 `createStore` 的包装函数,并接受一个参数来设置初始状态。在这个示例中,我们扩展 `increment` 以接受一个附加参数,该参数将被添加到 `state.count` 上。如果未提供该参数,我们只将 `state.count` 增加 1。

```js
const createVuexStore = (initialState) =>
Expand Down Expand Up @@ -179,13 +179,13 @@ test('increment mutation with a value', () => {

通过创建一个接受初始状态的 `createVuexStore` 函数,我们可以轻松设置初始状态。这使我们能够测试所有边界情况,同时简化我们的测试。

[Vue 测试手册](https://lmiller1990.github.io/vue-testing-handbook/testing-vuex.html)中有更多关于测试 Vuex 的示例。注意:这些示例适用于 Vue.js 2 和 Vue Test Utils v1。思想和概念是相同的,Vue 测试手册将在不久的将来更新为 Vue.js 3 和 Vue Test Utils 2。
这份 [Vue 测试手册](https://lmiller1990.github.io/vue-testing-handbook/testing-vuex.html)中有更多关于测试 Vuex 的示例。注意:这些示例适用于 Vue.js 2 和 Vue Test Utils v1。但思想和概念是相同的。Vue 测试手册将来会更新,以适用于 Vue.js 3 和 Vue Test Utils 2。

## 使用组合 API 进行测试

在使用组合 API 时,通过 `useStore` 函数访问 Vuex。[在这里阅读更多相关内容](https://next.vuex.vuejs.org/guide/composition-api.html)
在使用组合 API 时,可以通过 `useStore` 函数访问 Vuex。[在这里阅读更多相关内容](https://next.vuex.vuejs.org/guide/composition-api.html)

`useStore` 可以与可选的唯一注入键一起使用,[Vuex 文档中所述](https://next.vuex.vuejs.org/guide/typescript-support.html#typing-usestore-composition-function)
[Vuex 文档中所述](https://next.vuex.vuejs.org/guide/typescript-support.html#typing-usestore-composition-function)`useStore` 可以与可选的唯一注入键一起使用

它看起来像这样:

Expand All @@ -198,7 +198,7 @@ const key = Symbol()

const App = {
setup() {
// 使用唯一键访问存储
// 使用唯一键访问 store
const store = useStore(key)
}
}
Expand All @@ -218,7 +218,7 @@ app.use(store, key)

### 测试不使用注入键的 `useStore` 的组件

如果不使用注入键,存储数据可以通过全局 `provide` 挂载选项直接注入到组件中。注入的存储名称必须与组件中的名称相同,例如 “store”。
如果不使用注入键,store 里的数据可以通过全局 `provide` 挂载选项直接注入到组件中。注入的 store 名称必须与组件中的名称相同,例如 “store”。

#### 提供未键入的 `useStore` 示例

Expand All @@ -240,11 +240,11 @@ const wrapper = mount(App, {

### 测试使用注入键的 `useStore` 的组件

当使用带有注入键的存储时,之前的方法将无法工作。存储实例将不会从 `useStore` 返回。为了访问正确的存储,需要提供标识符
当使用带有注入键的 store 时,之前的方法将无法工作。store 实例将不会从 `useStore` 返回。为了访问正确的 store,我们需要提供标识符

它必须是传递给组件的 `setup` 函数中 `useStore` 的确切键,或者在自定义辅助函数中调用 `useStore` 时使用的键。由于 JavaScript symbols 是唯一的且无法重建,最好从真实的存储中导出该键
它必须是传递给组件的 `setup` 函数中 `useStore` 的确切键,或者在自定义辅助函数中调用 `useStore` 时使用的键。由于 JavaScript symbols 是唯一的且无法重建,最好从真实的 store 中导出该键

你可以使用 `global.provide` 和正确的键来注入存储,或者使用 `global.plugins` 安装存储并指定键
你可以使用 `global.provide` 和正确的键来注入 store,或者使用 `global.plugins` 安装 store 并指定键

#### 使用 `global.provide` 提供带有键的 `useStore`

Expand Down Expand Up @@ -297,7 +297,7 @@ const wrapper = mount(App, {

## 结论

- 使用 `global.plugins` 安装 Vuex 作为插件
- 使用 `global.mocks` 模拟全局对象,例如 Vuex,以满足高级用例
- 考虑单独测试复杂的 Vuex 变更和动作
- 使用一个接受参数的函数来封装 `createStore`,以便设置特定的测试场景
- 使用 `global.plugins` 以插件形式安装 Vuex
- 使用 `global.mocks` 模拟诸如 Vuex 的全局对象,以满足高级用例
- 考虑单独测试复杂的 Vuex mutation 和 action
- 使用 `createStore` 的包装函数,以便接收参数设置特定的测试场景

0 comments on commit f5f1b6c

Please sign in to comment.