Vitest - псевдоним папки @src не разрешен в тестовых файлах
У меня есть проект vue3, использующий Vite/Vitest, как рекомендовано в документации Vue.js.
Вот структура проекта:
src
components
// my Vue components here, potentially in sub-folders. For example:
HelloWorld.vue
router
index.ts
App.vue
main.ts
vitest
components
// My test specs. For example:
HelloWorld.spec.ts
// ...
tsconfig.app.json
tsconfig.json
tsconfig.vite-config.json
tsconfig.vitest.json
vite.config.ts
В
@/
псевдоним для
src
папка правильно разрешена в файлах компонентов. Однако в моих тестовых файлах я получаю сообщение об ошибке: не удается найти модуль.
Например, в
HelloWorld.spec.ts
:
import HelloWorld from '@/components/HelloWorld.vue'; // <-- error !
import { describe, it } from 'vitest';
describe('HelloWorld', () => {
it('should day hello', () => {
// ...
});
});
tsconfig.app.json
{
"extends": "@vue/tsconfig/tsconfig.web.json",
"include": [
"env.d.ts",
"src/**/*",
"src/**/*.vue"
],
"exclude": [
"vitest/**/*"
],
"compilerOptions": {
"composite": true,
"baseUrl": ".",
"paths": {
"@/*": [
"./src/*"
]
},
"strict": true,
"experimentalDecorators": true
}
}
vite.config.js
import vue from '@vitejs/plugin-vue';
import { fileURLToPath, URL } from 'url';
import { defineConfig } from 'vite';
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url)),
},
},
test: {
include: ['./vitest/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
},
});
3 ответа
Вам просто нужно указать псевдонимы в вашемvitest.config.js
файл:
import path from 'path'
import vue from '@vitejs/plugin-vue'
export default {
plugins: [vue()],
test: {
globals: true,
environment: 'jsdom',
},
resolve: {
alias: {
'@': path.resolve(__dirname, './src')
},
},
}
Для пользователей SvelteKit я столкнулся с аналогичной проблемой, и мне пришлось добавить $lib в vitest.config.js.
import { defineConfig } from 'vitest/config';
import { svelte } from '@sveltejs/vite-plugin-svelte';
import path from 'path';
export default defineConfig({
plugins: [svelte({ hot: !process.env.VITEST })],
test: {
globals: true,
environment: 'jsdom',
},
resolve: {
alias: {
$lib: path.resolve(__dirname, './src/lib'),
},
},
});
Окончательное решение, которое сработало для меня, состояло в том, чтобы включить тестовые файлы вtsconfig.vitest.json
:
tsconfig.app.json ( без изменений по сравнению с постом вопроса )
{
"extends": "@vue/tsconfig/tsconfig.web.json",
"include": [
"env.d.ts",
"src/**/*",
"src/**/*.vue"
],
"exclude": [
"vitest/**/*"
],
"compilerOptions": {
"composite": true,
"baseUrl": ".",
"paths": {
"@/*": [
"./src/*"
]
},
"strict": true,
"experimentalDecorators": true
}
}
tsconfig.vitest.json
{
"extends": "./tsconfig.app.json",
"include": [
"vitest/**/*",
],
"exclude": [],
"compilerOptions": {
"composite": true,
"lib": [],
"types": [
"node",
"jsdom"
],
}
}