Vue Test Utils — официальный низкоуровневый инструмент для тестирования компонентов Vue. Он не является тестовым раннером и не выполняет тесты самостоятельно. Его задача — предоставить API для монтирования компонентов, управления их состоянием и взаимодействия с DOM в тестовой среде.
Типичная связка выглядит так:
Корректная настройка окружения критична: ошибки на этом этапе приводят к нестабильным тестам, сложным мокам и ложным падениям.
Для Vue 3 де-факто стандартом стал Vitest:
Установка:
npm install -D vitest @vue/test-utils jsdom
Для проектов на Vue 2 чаще используется Jest, но архитектура настройки схожа.
Минимальная структура проекта с тестами:
src/
components/
MyComponent.vue
tests/
MyComponent.spec.js
vitest.config.js
Разделение src и tests упрощает навигацию и
исключает попадание тестов в сборку.
Vue Test Utils требует DOM-окружение. В
vitest.config.js:
import { defineConfig } from 'vitest/config'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [vue()],
test: {
environment: 'jsdom'
}
})
Без jsdom любые операции с DOM (mount,
find, trigger) будут недоступны.
Vue Test Utils не требует глобальной инициализации, но предоставляет объект глобальных настроек.
Импорт:
import { mount, shallowMount } from '@vue/test-utils'
Ключевые функции:
Часто требуется единая конфигурация для всех тестов: плагины, глобальные компоненты, директивы. Для этого используется setup-файл.
В vitest.config.js:
test: {
setupFiles: './tests/setup.js'
}
Содержимое tests/setup.js:
import { config } from '@vue/test-utils'
Регистрация глобальных компонентов:
config.global.components = {
BaseButton: {
template: '<button><slot /></button>'
}
}
Это избавляет от необходимости регистрировать их в каждом тесте.
Подключение Vue-плагинов:
import { createI18n } from 'vue-i18n'
const i18n = createI18n({
locale: 'ru',
messages: {}
})
config.global.plugins = [i18n]
Важно: плагины создаются один раз и переиспользуются, если они не зависят от состояния теста.
Для this.$router, this.$route,
this.$t и аналогов:
config.global.mocks = {
$t: (key) => key,
$router: {
push: vi.fn()
}
}
Это позволяет изолировать компонент от реальной реализации.
Vue Test Utils позволяет передавать provide
напрямую:
mount(MyComponent, {
global: {
provide: {
apiService: mockApi
}
}
})
Для часто используемых зависимостей допустимо вынести их в глобальную конфигурацию, но это снижает прозрачность тестов.
config.global.stubs = {
RouterLink: true,
RouterView: true
}
Или кастомная реализация:
RouterLink: {
template: '<a><slot /></a>'
}
Заглушки ускоряют тесты и уменьшают количество неявных зависимостей.
Vue Test Utils не очищает глобальные настройки автоматически. Если используются моки с состоянием:
afterEach(() => {
vi.clearAllMocks()
})
При изменении config.global в конкретных тестах
необходимо явно возвращать состояние.
CSS не влияет на логику компонентов, но может ломать тесты при импорте:
test: {
css: false
}
Если компоненты импортируют изображения или SVG, Vitest автоматически их мокает, но при кастомных загрузчиках может потребоваться ручная настройка.
Vue Test Utils корректно обрабатывает setup, но
асинхронные операции требуют ожидания:
import { flushPromises } from '@vue/test-utils'
await flushPromises()
flushPromises должен быть доступен глобально или
импортироваться явно.
Простейший smoke-тест:
import { mount } from '@vue/test-utils'
import MyComponent from '@/components/MyComponent.vue'
test('component mounts', () => {
const wrapper = mount(MyComponent)
expect(wrapper.exists()).toBe(true)
})
Если тест проходит, окружение настроено корректно.
Минимальность В глобальной конфигурации размещаются только действительно общие зависимости.
Предсказуемость Каждый тест должен явно понимать, какие плагины и моки участвуют.
Изоляция Глобальные моки не должны хранить состояние между тестами.
Повторяемость Окружение должно одинаково работать локально и в CI.
mount без jsdomsetupFilesSetup тестового окружения — фундамент всей системы тестирования. Правильно настроенный Vue Test Utils позволяет писать короткие, стабильные и изолированные тесты, не тратя время на инфраструктурные проблемы и отладку среды.