NodeJS: Jak pisać testy dla operacji na plikach z Vitest?
Opublikowano: 28.12.2024 - tagi: NodeJS JavaScript TypeScript Plik Zapis Odczyt Testowanie Testy Test Vitest
Testowanie plików
Pisanie testów, które mają sprawdzać kod operujący na plikach, może być problematyczne. Jednym ze sposobów może być użycie mocków. Na przykład chcesz sprawdzić wczytywanie pliku. Wystarczy, że stworzysz mocka dla funkcji, która wczytuje plik. Osobiście nie lubię takiego podejścia. Pisanie testów, w taki sposób za bardzo skupia się na szczegółach implementacyjnych. Utrzymanie takich testów staje się uciążliwe.
Jakie jest inne wyjście? Możemy skorzystać z biblioteki, która symuluje operacje na plikach. Wszystko to dzieje się nie na dysku, ale w pamięci RAM, więc mamy gwarancję, że nasze testy będą szybkie.
Jedną z takich bibliotek jest: memfs. Ma takie samo API jak standardowa biblioteka fs NodeJS.
Instalacja memfs
Odpal komendę:
npm i -D memfs
Konfiguracja Vitest
Zanim napiszemy test musimy skonfigurować Vitest, żeby podczas uruchamiania testów podmieniał bibliotekę fs na memfs.
Otwórz plik vitest.config.js i dodaj ten fragment:
import { defineConfig } from 'vite'
import path from 'path'
export default defineConfig({
resolve: {
alias: {
'node:fs': path.resolve(__dirname, './node_modules/memfs'),
},
},
})
Dzięki temu kiedy Vitest napotka w testowanym kodzie import:
import fs from 'node:fs'
Podmieni to na bibliotekę memfs:
import { fs } from 'memfs';
Przykład użycia memfs
Plik: file.ts:
import fs from 'node:fs'
export function createFile(name: string, content: string): void {
fs.writeFileSync(name, content);
}
Test: file.test.ts:
import { expect, test } from 'vitest';
import { fs } from 'memfs';
import { createFile } from './file';
test('should create a file', async () => {
// given
fs.mkdirSync('.', { recursive: true })
const fileName = './test';
createFile(fileName, 'Some content')
// when
const content = fs.readFileSync(fileName, 'utf8');
// then
expect(content).toEqual('Some content');
});