Это руководство было написано для Vue.js 3 и Vue Test Utils v2.
Версия для Vue.js 2 здесь.
# Тестирование геттеров
Тестировать геттеры в изоляции достаточно просто, так как это обычные JavaScript функции. Техника очень похожа на тестирование мутаций и действий, больше информации здесь.
Исходный код для теста на этой странице можно найти здесь.
Мы рассмотрим два геттера, которые работают с хранилищем, выглядящим так:
const state = {
dogs: [
{ name: "Лаки", breed: "пудель", age: 1 },
{ name: "Пёсик", breed: "далматинец", age: 2 },
{ name: "Блэки", breed: "пудель", age: 4 }
]
}
Геттеры, которые будем тестировать:
poodles
: получаем всех пуделейpoodlesByAge
: получаем всех пуделей определённого возраста
# Создание геттеров
Давайте сначала сделаем геттеры:
export default {
poodles: (state) => {
return state.dogs.filter(dog => dog.breed === "пудель")
},
poodlesByAge: (state, getters) => (age) => {
return getters.poodles.filter(dog => dog.age === age)
}
}
Ничего особенного – помните, что геттеры принимают другие геттеры вторым аргументом. Так как у нас уже есть геттер poodles
, мы можем использовать его в poodlesByAge
. Возвращая функцию в poodlesByAge
, принимающую аргумент, мы можем передать аргументы в геттеры. Геттер poodlesByAge
можно использовать так:
computed: {
puppies() {
return this.$store.getters.poodlesByAge(1)
}
}
Начнём с тестирования poodles
.
# Написание тестов
Так как геттер – это обычная JavaScript функция, которая принимает объект state
первым аргументом, тестировать будет достаточно просто. Я буду писать тест в файле getters.spec.js
со следующим кодом:
import getters from "../../src/store/getters.js"
const dogs = [
{ name: "Лаки", breed: "пудель", age: 1 },
{ name: "Пёсик", breed: "далматинец", age: 2 },
{ name: "Блэки", breed: "пудель", age: 4 }
]
const state = { dogs }
describe("poodles", () => {
it("возвращает пуделей", () => {
const actual = getters.poodles(state)
expect(actual).toEqual([ dogs[0], dogs[2] ])
})
})
Vuex автоматически передаёт state
в геттер, но так как мы тестируем геттеры в изоляции, нужно передавать state
вручную. Кроме того, мы тестируем обычную функцию JavaScript.
poodlesByAge
немного интереснее. Вторым аргументом является другие геттеры. Мы тестируем poodlesByAge
, поэтому не хотим реализовывать poodles
. Вместо этого, мы можем использовать заглушку для getters.poodles
. Это даст нам больше контроля над тестом.
describe("poodlesByAge", () => {
it("возвращет пуделей по возрасту", () => {
const poodles = [ dogs[0], dogs[2] ]
const actual = getters.poodlesByAge(state, { poodles })(1)
expect(actual).toEqual([ dogs[0] ])
})
})
Вместо передачи настоящего геттера poodles
, мы передаём результат, который бы он вернул. Мы уже знаем, что он работает, так как тест написан. Это позволяет нам сфокусироваться на тестировании уникальной логики poodlesByAge
.
Есть возможность делать async
геттеры. Они тестируются так же, как и async
действия, о которых можно прочитать здесь.
# Заключение
getters
– это обычные JavaScript функции- При тестировании геттеров в изоляции, нужно передавать хранилище вручную
- Если геттер использует другой геттер, вы должны использовать заглушку, которая возвращает ожидаемый результат. Это даст больше контроля над тестом и позволит сфокусироваться на тестировании рассматриваемого геттера
Исходный код для теста на этой странице можно найти здесь.