Это руководство было написано для Vue.js 3 и Vue Test Utils v2.
Версия для Vue.js 2 здесь.
# Тестирование мутаций
Тестировать мутации в изоляции достаточно просто, так как это обычные JavaScript функции. На этой странице обсудим тестирование мутаций в изоляции. Если вы хотите тестировать мутации в контексте компонента, то смотрите здесь.
Тест для последующего примера можно найти тут.
# Создание мутации
Мутации следует паттерну функции, которая записывает значение свойства. Получаем какую-либо информацию, возможно обрабатываем её, затем складываем в хранилище. Вот обёртка для мутации ADD_POST
. Она будет получать объект post
как нагрузку и
добавлять post.id
в state.postIds
. Она также будет добавлять объект post
в state.posts
, где ключом является post.id
. Это обычный паттерн, применяемый в приложениях с Vuex.
Мы сделаем это по TDD. Начало мутации выглядит следующим образом:
export default {
SET_POST(state, { post }) {
}
}
Давайте напишем тест и пусть ошибки подсказывают нам, что делать дальше:
import mutations from "@/store/mutations.js"
describe("SET_POST", () => {
it("добавляет пост в хранилище", () => {
const post = { id: 1, title: "Post" }
const state = {
postIds: [],
posts: {}
}
mutations.SET_POST(state, { post })
expect(state).toEqual({
postIds: [1],
posts: { "1": post }
})
})
})
Запуск yarn test:unit
выдаст нам следующую ошибку:
FAIL tests/unit/mutations.spec.js
● SET_POST › добавляет пост в хранилище
expect(received).toEqual(expected)
Expected value to equal:
{"postIds": [1], "posts": {"1": {"id": 1, "title": "Post"}}}
Received:
{"postIds": [], "posts": {}}
Давайте начнём с добавления post.id
в state.postIds
:
export default {
SET_POST(state, { post }) {
state.postIds.push(post.id)
}
}
Теперь yarn test:unit
выводит:
Expected value to equal:
{"postIds": [1], "posts": {"1": {"id": 1, "title": "Post"}}}
Received:
{"postIds": [1], "posts": {}}
postIds
выглядит отлично. Теперь нам нужно просто добавить пост в state.posts
. При сегодняшнем состоянии системы Vue-реактивности, мы не может просто написать post[post.id] = post
, чтобы добавить пост. Подробнее можно почитать здесь. По сути, вам нужно создать новый объект, используя Object.assign
или оператор ...
. Мы используем оператор ...
, чтобы присвоить пост в state.posts
.
export default {
SET_POST(state, { post }) {
state.postIds.push(post.id)
state.posts = { ...state.posts, [post.id]: post }
}
}
Теперь тест проходит проверку!
# Заключение
Тестирование Vuex мутации не требует ничего специфичного для Vue или Vuex, так как это обычные JavaScript функции. Просто импортируйте их и тестируйте, если необходимо. Важно помнить единственную вещь – как работает система реактивности Vue, которая также применяется и к Vuex. Подробнее о системе реактивности и ограничениях можно почитать здесь.
На этой странице обсудили:
- что Vuex мутация – это обычные JavaScript функции
- что мутации могут и должны тестироваться в изоляции от основного приложения Vue
Тест для примера выше можно найти тут.