NodeJS: Co zrobić, aby działały ścieżki absolutne w Vitest?

Opublikowano: 24.12.2024 - tagi: Vitest JavaScript TypeScript Ścieżka Testowanie NodeJS Konfiguracja

Konfiguracja

Załóżmy, że mamy taką strukturę katalogów:

tsconfig.json
vitest.config.js
src
	index.ts
	calculator
		add.ts
		sub.ts
		index.ts

Tak wygląda konfiguracja pliku tsconfig.json:

{
	"compilerOptions": {
		...
		"baseUrl": ".",
		"paths": {
			"@/*": ["./src/*"]
		},
		"include": ["src"]
	}
}

Skupiłem się głównie na konfiguracji ścieżek absolutnych, resztę pominąłem.

Teraz pliki z kodem:

calculator/add.ts:

export function add(a, b): number {
	return a + b;
}

calculator/sub.ts:

export function sub(a, b): number {
	return a - b;
}

calculator/index.ts:

export * from './add'
export * from './sub'

index.ts:

import { add, sub } from '@/calculator'

const resultAdd = add(2, 2);
const resultSub = sub(2, 2);

console.log('resultAdd: ', resultAdd); // 4
console.log('resultSub: ', resultSub); // 0

Po uruchomieniu kodu wszystko działa prawidłowo. Napiszmy teraz test przy użyciu Vitest.

add.test.ts:

import { expect, test } from 'vitest'
import { add } from '@/calculator'

test('should add two numbers', () => {
    // given
    const a = 2;
    const b = 2;
    const expected = 4;

    // when
    const result = add(a, b);

    // then
    expect(result).toEqual(expected)
})

Po uruchomieniu testu okazuje się, że mamy problem!

Error: Failed to load url @/calculator (resolved id: @/calculator)

Jak sobie z tym poradzić?

Ścieżki absolutne w Vitest

Można to naprawić w łatwy sposób. Otwórz plik vitest.config.js i dodaj taki kod:

import { defineConfig } from 'vite'
import path from 'path'

export default defineConfig({
    resolve: {
        alias: {
            '@': path.resolve(__dirname, './src')
        },
    },
})

Linijka:

 '@': path.resolve(__dirname, './src')

Poinformuje Vitest, jak ma "czytać" ścieżki zaczynające się od @.

Po dodaniu konfiguracji test zostanie poprawnie uruchomiony.