Skip to content

Commit 7dc0b47

Browse files
webistominlmiller1990
authored andcommitted
Russian translation (#116)
* fix(.eslintrc): fix some issues with JSON format * docs(config.js): translate main navigation * docs(readme.md): translate first section * docs(setting-up-for-tdd.md): translate setting up for tdd * docs(rendering a component): translate rendering a component * docs(component with props): translate components with props * docs(reamde ru, computed-properties): add russian readme. translate computed prop article * docs(all articles): rewrite some articles * docs(fix some typo): * docs(readme): add rus readme * docs(reamde): fix broken link * Update src/ru/components-with-props.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/components-with-props.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/components-with-props.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/components-with-props.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/components-with-props.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/computed-properties.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/computed-properties.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/setting-up-for-tdd.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/setting-up-for-tdd.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/setting-up-for-tdd.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/components-with-props.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/components-with-props.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/components-with-props.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/computed-properties.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/computed-properties.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/computed-properties.md Co-Authored-By: Manyaka <[email protected]> * docs(simulating-user-input.md): translate simulating-user-input article * Update src/ru/simulating-user-input.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/simulating-user-input.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/simulating-user-input.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/simulating-user-input.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/simulating-user-input.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/simulating-user-input.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/simulating-user-input.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/simulating-user-input.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/simulating-user-input.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/simulating-user-input.md Co-Authored-By: Manyaka <[email protected]> * translate testing-emitted-events article * Update src/ru/testing-emitted-events.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/testing-emitted-events.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/testing-emitted-events.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/testing-emitted-events.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/testing-emitted-events.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/testing-emitted-events.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/testing-emitted-events.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/testing-emitted-events.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/testing-emitted-events.md Co-Authored-By: Manyaka <[email protected]> * translate mocking-global-objects article * docs(articles): fix extensions * chore(stubbing-components): translate stubbing-component article * docs(config.js): fix some typo * docs(finding elements): translate finfing-elements article * translate testin-vuex article * translate jest-mocking-modules * translate vuex-mutations * Update src/ru/finding-elements-and-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/finding-elements-and-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/finding-elements-and-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/finding-elements-and-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/finding-elements-and-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/stubbing-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/stubbing-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/testing-vuex.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/testing-vuex.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/stubbing-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/finding-elements-and-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/finding-elements-and-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/finding-elements-and-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/finding-elements-and-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/jest-mocking-modules.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/mocking-global-objects.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/mocking-global-objects.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/mocking-global-objects.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/mocking-global-objects.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/mocking-global-objects.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/mocking-global-objects.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/mocking-global-objects.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/mocking-global-objects.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/stubbing-components.md Co-Authored-By: Manyaka <[email protected]> * docs(translate vuex-actions): * Update src/ru/vuex-actions.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-actions.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-actions.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-actions.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-actions.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-actions.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-actions.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/simulating-user-input.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/simulating-user-input.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/simulating-user-input.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/simulating-user-input.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/simulating-user-input.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/simulating-user-input.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/simulating-user-input.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/stubbing-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/testing-emitted-events.md Co-Authored-By: Manyaka <[email protected]> * fix typo * docs(vuex-getters): translate vuex-gettres article * docs(vuex-in-components): * docs(vuex-in-components-mutations-and-actions.md): translate another one article * translate vue-router * fix links * Update src/ru/vuex-getters.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-getters.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-getters.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components-mutations-and-actions.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components-mutations-and-actions.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components-mutations-and-actions.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components-mutations-and-actions.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components-mutations-and-actions.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components-mutations-and-actions.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components-mutations-and-actions.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components-mutations-and-actions.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components-mutations-and-actions.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components-mutations-and-actions.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/setting-up-for-tdd.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/setting-up-for-tdd.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/setting-up-for-tdd.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/setting-up-for-tdd.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/setting-up-for-tdd.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components-mutations-and-actions.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components-mutations-and-actions.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vuex-in-components-mutations-and-actions.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * Update src/ru/vue-router.md Co-Authored-By: Manyaka <[email protected]> * small fix
1 parent bb79411 commit 7dc0b47

25 files changed

+15047
-13
lines changed

.eslintrc

+6-6
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
"jest": true,
77
"afterEach": true
88
},
9-
env: {
10-
node: true
9+
"env": {
10+
"node": true
1111
},
1212
"parserOptions": {
1313
"parser": "babel-eslint",
@@ -22,9 +22,9 @@
2222
"indent": ["error", 2],
2323
"no-multi-spaces": "error"
2424
},
25-
extends: [
26-
'eslint:recommended',
27-
'plugin:vue/base',
28-
'plugin:vue/essential'
25+
"extends": [
26+
"eslint:recommended",
27+
"plugin:vue/base",
28+
"plugin:vue/essential"
2929
]
3030
}

README.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
[English](https://github.com/lmiller1990/vue-testing-handbook#vue-testing-handbook) | [日本語](https://github.com/lmiller1990/vue-testing-handbook#vue-testing-handbook-1)
1+
[English](https://github.com/lmiller1990/vue-testing-handbook#vue-testing-handbook) | [日本語](https://github.com/lmiller1990/vue-testing-handbook#vue-testing-handbook-1) | [Русский](https://github.com/webistomin/vue-testing-handbook/blob/master/README.ru.md)
22

33
## Vue Testing Handbook
44

@@ -10,14 +10,14 @@ This is a collection of short, focused examples on how to test Vue components. I
1010

1111
## Languages
1212

13-
The handbook is written in English. We have a Japanese translation in progress. Please make an issue if you would like to translate the book into your own language!
13+
The handbook is written in English. We have a Russian and Japanese translation in progress. Please make an issue if you would like to translate the book into your own language!
1414

1515
## Contributing
1616

1717
### Development
1818

1919
[Vuepress](https://vuepress.vuejs.org/) is used to generate the static website. Articles are written in markdown.
2020

21-
Clone the repo and run `yarn` to install the dependencies. Then run `yarn dev` to open the dev server. Access it on `localhost:8080`.
21+
Clone the repo and run `yarn` to install the dependencies. Then run `yarn dev` to open the dev server. Access it on `localhost:8080`.
2222

23-
To edit a guide, update the code in the [src](https://github.com/lmiller1990/vue-testing-handbook/tree/master/src) directory. The markdown files are converted to HTML when deployed - no need to edit those.
23+
To edit a guide, update the code in the [src](https://github.com/lmiller1990/vue-testing-handbook/tree/master/src) directory. The markdown files are converted to HTML when deployed no need to edit those.

README.ru.md

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
[English](https://github.com/lmiller1990/vue-testing-handbook#vue-testing-handbook) | [日本語](https://github.com/lmiller1990/vue-testing-handbook#vue-testing-handbook-1) | [Русский](https://github.com/webistomin/vue-testing-handbook/blob/master/README.ru.md)
2+
3+
## Руководство по тестированию Vue приложений
4+
5+
Добро пожаловать в руководство по тестированию Vue приложений!
6+
7+
## Что это?
8+
9+
Это коллекция коротких примеров тестирования vue-компонентов с использованием `vue-test-utils` – официальной библиотекой для тестированию vue-компонентов. Также используется `Jest` – современный тестовый фреймворк. Рассматривается `vue-test-utils` API и лучшие практики тестирования. Демки тестов также присутствуют. Вы можете скачать их и запускать самостоятельно.
10+
11+
## Переводы
12+
13+
На данный момент руководство доступно на английском, японском и русском языках. Пожалуйста, создайте issue, если вы хотите перевести книгу на свой язык.
14+
15+
## Участие в разработке
16+
17+
### Разработка
18+
19+
Для генерация сайта используется [Vuepress](https://vuepress.vuejs.org/). Все статьи пишутся в формате markdown.
20+
21+
Клонируйте этот репозиторий и запускайте `yarn`, чтобы установить все зависимости. Затем напишите `yarn dev`, откроется сервер для разработки по адресу `localhost:8080`.
22+
23+
Правьте книгу в папке [src](https://github.com/lmiller1990/vue-testing-handbook/tree/master/src). Markdown файлы сконвертируются в HTML при деплое.

package-lock.json

+12,250
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/.vuepress/config.js

+31-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ module.exports = {
1818
'/ja/': {
1919
lang: 'ja-JP',
2020
title: 'Vueテストハンドブック',
21-
}
21+
},
22+
'/ru/': {
23+
lang: 'ru-RU',
24+
title: 'Руководство по тестированию Vue-компонентов',
25+
},
2226
},
2327
themeConfig: {
2428
repo: 'lmiller1990/vue-testing-handbook',
@@ -75,6 +79,32 @@ module.exports = {
7579
['/ja/jest-mocking-modules', 'Jestでモジュールをモック'],
7680
['/ja/vue-router', 'Vueルーター'],
7781
]
82+
},
83+
'/ru/': {
84+
label: 'Русский',
85+
selectText: 'Переводы',
86+
lastUpdated: 'Последнее обновление',
87+
editLinkText: 'Редактировать эту страницу на GitHub',
88+
sidebar: [
89+
['/ru/', 'Введение'],
90+
['/ru/setting-up-for-tdd', 'Подготовка к TDD'],
91+
['/ru/rendering-a-component', 'Отрисовка компонентов'],
92+
['/ru/components-with-props', 'Тестирование входных параметров'],
93+
['/ru/computed-properties', 'Вычисляемые свойства'],
94+
['/ru/simulating-user-input', 'Симулирование пользовательского ввода'],
95+
['/ru/testing-emitted-events', 'Тестирование пользовательских событий'],
96+
['/ru/mocking-global-objects', 'Мокаем глобальные объекты'],
97+
['/ru/stubbing-components', 'Заглушки для компонентов'],
98+
['/ru/finding-elements-and-components', 'Поиск элементов и компонентов'],
99+
['/ru/testing-vuex', 'Тестирование Vuex'],
100+
['/ru/vuex-mutations', 'Vuex - Мутации'],
101+
['/ru/vuex-actions', 'Vuex - Действия'],
102+
['/ru/vuex-getters', 'Vuex - Геттеры'],
103+
['/ru/vuex-in-components', 'Vuex в компонентах - $state и геттеры'],
104+
['/ru/vuex-in-components-mutations-and-actions', 'Vuex в компонентах - мутации и действия'],
105+
['/ru/jest-mocking-modules', 'Jest - мокаем модули'],
106+
['/ru/vue-router', 'Vue Router'],
107+
]
78108
}
79109
}
80110
},

src/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,4 @@ We will also explore how to use the Jest API to make our tests more robust, such
2727

2828
## Languages
2929

30-
For now, the guide is in English and Japanese.
30+
For now, the guide is in English, Japanese and Russian.

src/ru/README.md

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
## О чём это руководство?
2+
3+
Добро пожаловать в руководство по тестированию Vue-приложений!
4+
5+
Здесь собрана коллекция коротких примеров тестирования компонентов с использованием `vue-test-utils` – официальной библиотекой для тестированию vue-компонентов. Также используется `Jest` – современный тестовый фреймворк. Рассматривается `vue-test-utils` API и лучшие практики тестирования.
6+
7+
Руководство написано так, что его главы независимы одна от другой. Мы начнём с настройки окружения с помощью `vue-cli` и написания простейших тестов. Затем изучим два способа отрисовки компонентов – `mount` и `shallowMount`, поймём разницу между ними.
8+
9+
Затем разберем несколько сценариев, которые возникают при тестировании компонентов:
10+
11+
- принятие входных параметров
12+
- использование вычисляемых свойств
13+
- отрисовка других компонентов
14+
- пользовательские события
15+
16+
и так далее. Потренируемся на таких интересных кейсах, как:
17+
18+
- тестирование Vuex в компонентах и изоляции
19+
- тестирование Vue router
20+
- тестирование сторонних компонентов
21+
22+
Также поработаем с Jest API, сделаем наши тесты более надежными:
23+
24+
- замокаем API ответы
25+
- замокаем модули и добавим spies (шпионы)
26+
- используем снимки
27+
28+
## Переводы
29+
30+
На данный момент руководство доступно на английском, японском и русском языках.

src/ru/components-with-props.md

+203
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
## Добавляем входные параметры через propsData
2+
3+
`propsData` может использоваться как с `mount`, так и с `shallowMount`. Данный метод часто используют при тестировании входных параметров, которые получает компонент от своего родителя.
4+
5+
`propsData` передаётся вторым аргуметов в `shallowMount` или `mount` в следующем виде:
6+
7+
```js
8+
const wrapper = shallowMount(Foo, {
9+
propsData: {
10+
foo: 'bar'
11+
}
12+
})
13+
```
14+
15+
## Создаём компонент
16+
17+
Добавим новый простенький компонент `<SubmitButton>`, который принимает на вход параметры `msg` и `isAdmin`. В зависимости от `isAdmin` компонент будет содержать `<span>` в одном из двух состояний:
18+
19+
* `Не авторизован`, если `isAdmin` в значении false (или не передан)
20+
* `Привилегии администратора`, если `isAdmin` в значении true
21+
22+
```vue
23+
<template>
24+
<div>
25+
<span v-if="isAdmin">Привилегии администратора</span>
26+
<span v-else>Не авторизован</span>
27+
<button>
28+
{{ msg }}
29+
</button>
30+
</div>
31+
</template>
32+
33+
<script>
34+
export default {
35+
name: "SubmitButton",
36+
37+
props: {
38+
msg: {
39+
type: String,
40+
required: true
41+
},
42+
isAdmin: {
43+
type: Boolean,
44+
default: false
45+
}
46+
}
47+
}
48+
</script>
49+
```
50+
51+
## Первый тест
52+
53+
Добавим проверку сообщения в случае, когда у пользователя нет привилегий администратора.
54+
55+
```js
56+
import { shallowMount } from '@vue/test-utils'
57+
import SubmitButton from '@/components/SubmitButton.vue'
58+
59+
describe('SubmitButton.vue', () => {
60+
it("Отображает сообщение для неавторизованного пользователя", () => {
61+
const msg = "Войти"
62+
const wrapper = shallowMount(SubmitButton,{
63+
propsData: {
64+
msg: msg
65+
}
66+
})
67+
68+
console.log(wrapper.html())
69+
70+
expect(wrapper.find("span").text()).toBe("Не авторизован")
71+
expect(wrapper.find("button").text()).toBe("Войти")
72+
})
73+
})
74+
```
75+
76+
Запустим тесты через `yarn test:unit`. Результат будет следующий:
77+
78+
```bash
79+
PASS tests/unit/SubmitButton.spec.js
80+
SubmitButton.vue
81+
✓ Отображает сообщение для неавторизованного пользователя (15ms)
82+
```
83+
84+
Также выведется результат `console.log(wrapper.html())`
85+
86+
```html
87+
<div>
88+
<span>Не авторизован</span>
89+
<button>
90+
Войти
91+
</button>
92+
</div>
93+
```
94+
95+
Как мы видим, `msg` обработался и результирующая разметка отрисовалась правильно.
96+
97+
## Второй тест
98+
99+
Давайте также добавим проверку еще одного возможного случая, когда `isAdmin` в значении `true`
100+
101+
```js
102+
import { shallowMount } from '@vue/test-utils'
103+
import SubmitButton from '@/components/SubmitButton.vue'
104+
105+
describe('SubmitButton.vue', () => {
106+
it('Отображает сообщение для администратора', () => {
107+
const msg = "Войти"
108+
const isAdmin = true
109+
const wrapper = shallowMount(SubmitButton,{
110+
propsData: {
111+
msg,
112+
isAdmin
113+
}
114+
})
115+
116+
expect(wrapper.find("span").text()).toBe("Привилегии администратора")
117+
expect(wrapper.find("button").text()).toBe("Войти")
118+
})
119+
})
120+
```
121+
122+
Запустим тесты через `yarn test:unit` и посмотрим на результаты:
123+
124+
```bash
125+
PASS tests/unit/SubmitButton.spec.js
126+
SubmitButton.vue
127+
✓ Отображает сообщение для администратора (4ms)
128+
```
129+
Мы также вывели разметку через `console.log(wrapper.html())`:
130+
131+
```html
132+
<div>
133+
<span>Привилегии администратора</span>
134+
<button>
135+
Войти
136+
</button>
137+
</div>
138+
```
139+
140+
Как мы видим `isAdmin` был использован, чтобы отрисовать правильный `<span>`
141+
142+
## Рефакторинг тестов
143+
144+
Давайте перепишем наши тесты, придерживаясь принципа "Don't Repeat Yourself" (не повторяйся). Так как все тесты проходят проверку, мы можем их уверенно изменять. После рефакторинга нам также нужно убедиться, что ничего не сломалось.
145+
146+
## Рефактор через фабрику (factory function)
147+
148+
В обоих тестах мы вызываем `shallowMount`, затем передаём похожий объект `propsData`. Мы можем это изменить, используя фабрику. Под фабрикой понимают функцию, которая возвращает объект, отсюда и её название.
149+
150+
```js
151+
const msg = "Войти"
152+
const factory = (propsData) => {
153+
return shallowMount(SubmitButton, {
154+
propsData: {
155+
msg,
156+
...propsData
157+
}
158+
})
159+
}
160+
```
161+
162+
Выше приведена функция, которая отрисовывает компонент `SubmitButton` через `shallowMount`. Мы можем передавать любые данные первым аргументом в функцию `factory`. Давайте перепишем тесты, придерживаясь принципа DRY.
163+
164+
```js
165+
describe("SubmitButton.vue", () => {
166+
describe("Нет привилегий администратора", ()=> {
167+
it("Выводит верное сообщение", () => {
168+
const wrapper = factory()
169+
170+
expect(wrapper.find("span").text()).toBe("Не авторизован")
171+
expect(wrapper.find("button").text()).toBe("Войти")
172+
})
173+
})
174+
175+
describe("Есть привилегии администратора", ()=> {
176+
it("Выводит верное сообщение", () => {
177+
const wrapper = factory({ isAdmin: true })
178+
179+
expect(wrapper.find("span").text()).toBe("Привилегии администратора")
180+
expect(wrapper.find("button").text()).toBe("Войти")
181+
})
182+
})
183+
})
184+
```
185+
186+
Давайте запустим тесты еще раз. Они всё еще работают.
187+
188+
```bash
189+
PASS tests/unit/SubmitButton.spec.js
190+
SubmitButton
191+
Нет привилегий администратора
192+
✓ Выводит верное сообщение (26ms)
193+
Есть привилегии администратора
194+
✓ Выводит верное сообщение (3ms)
195+
```
196+
197+
Поскольку у нас есть хороший набор тестов, мы можем легко и уверенно проводить рефакторинг.
198+
199+
## Заключение
200+
201+
- Передавая `propsData` во время отрисовки компонента, вы можете устанавливать входные параметры, которые будут применены в тесте
202+
- Функции-фабрики могут быть использованы, чтобы достичь принципа DRY в тестах
203+
- Вместо `propsData`, вы также можете использовать [`setProps`](https://vue-test-utils.vuejs.org/api/wrapper-array/#setprops-props) для того чтобы передавать входные параметры в тесты.

0 commit comments

Comments
 (0)