Vue Test Utils работает поверх среды выполнения JavaScript и напрямую зависит от конфигурации сборщика. Именно сборщик отвечает за:
*.vue файлов;@, ~);Неправильная или неполная конфигурация приводит к ошибкам импорта, падениям тестов и расхождениям поведения компонентов.
Для корректной работы тестов требуется:
.vue);process.env.Тестовый раннер (Jest, Vitest) не заменяет сборщик — он лишь использует его конфигурацию или её адаптацию.
.vue файловWebpack требует явного подключения vue-loader и
соответствующего плагина:
// webpack.config.js
const { VueLoaderPlugin } = require('vue-loader')
module.exports = {
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader'
}
]
},
plugins: [
new VueLoaderPlugin()
]
}
Без этого Vue Test Utils не сможет смонтировать компонент — шаблон не будет скомпилирован.
Алиасы должны полностью совпадать с используемыми в коде приложения:
resolve: {
alias: {
'@': path.resolve(__dirname, 'src')
},
extensions: ['.js', '.vue', '.json']
}
Это критично для корректной работы mount() и
shallowMount() при импорте компонентов и
composable-функций.
Jest и Webpack используют разные механизмы трансформации. Для
единообразия необходим babel-loader:
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader'
}
}
Без этого возможны ошибки при использовании optional chaining, nullish coalescing и других современных конструкций.
В тестах стили и изображения не имеют значения и должны быть заглушены:
{
test: /\.(css|scss)$/,
use: ['null-loader']
}
Или через Jest:
moduleNameMapper: {
'\\.(css|scss)$': 'identity-obj-proxy'
}
Webpack-конфигурация не используется Jest напрямую, но ключевые элементы должны быть продублированы.
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/src/$1'
}
transform: {
'^.+\\.vue$': '@vue/vue3-jest',
'^.+\\.js$': 'babel-jest'
}
Это обеспечивает согласованность трансформации компонентов между сборкой и тестами.
Vite изначально ориентирован на ES-модули и значительно упрощает настройку.
// vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
'@': '/src'
}
}
})
Vue Test Utils автоматически использует эту конфигурацию при работе с Vitest.
Vitest нативно интегрирован с Vite и не требует дублирования конфигурации.
export default defineConfig({
plugins: [vue()],
test: {
environment: 'jsdom',
globals: true
}
})
jsdom необходим для корректной работы
mount() и DOM-API.
Vitest использует resolve.alias и plugins
напрямую, поэтому:
defineProps, script setup, JSX
поддерживаются автоматически;moduleNameMapper.По умолчанию Vite игнорирует стили в тестах. Для более строгого контроля возможно явное отключение:
test: {
css: false
}
Это ускоряет тесты и исключает влияние CSS на snapshots.
jest.mock('@/api/http', () => ({
get: jest.fn()
}))
При этом путь должен быть разрешаемым через
moduleNameMapper.
vi.mock('@/api/http', () => ({
get: vi.fn()
}))
Механизм работает поверх ES-модулей и использует resolver Vite без дополнительной настройки.
process.env и import.meta.envnew webpack.DefinePlugin({
'process.env': JSON.stringify(process.env)
})
Без этого возможны ошибки при доступе к
process.env.NODE_ENV в компонентах.
Используется import.meta.env:
if (import.meta.env.DEV) {
// логика разработки
}
Vitest автоматически подставляет значения окружения из Vite-конфигурации.
Различия в конфигурации сборщика напрямую влияют на snapshot-тесты:
scoped-стилей.Для стабильности snapshots необходимо:
app.config.vue-loader или
@vitejs/plugin-vuejsdomТакой подход обеспечивает предсказуемую, воспроизводимую и масштабируемую среду модульного тестирования Vue-компонентов.