JavaScript: Jak pobrać N ostatnich elementów tablicy?

Opublikowano: 08.02.2025 - tagi: JavaScript Tablica Element

Pobieranie ostatnich elementów

Tablica:

const items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

I potrzebujesz na przykład pobrać 5 ostatnich elementów tablicy. Jak można to zrobić?

Przykład:

const result = items.slice(
  Math.max(items.length - 5, 0)
);

console.log(result); // [6, 7, 8, 9, 10]

Podsumowanie: Styczeń 2025

Opublikowano: 31.01.2025 - tagi: Blog Podsumowanie Styczeń 2025

W styczniu opublikowałem 1 wpis:


JavaScript:

  1. Vitest: Jak sprawdzić, czy funkcja rzuciła wyjątkiem?

Przeczytałem 2 książki:

  1. Praca z zastanym kodem. Najlepsze techniki — Michael Feathers
  2. Rozdroże kruków — Andrzej Sapkowski

Przesłuchałem 4 audiobooki:

  1. Sekret pacjentki — Loreth Anne White
  2. Mleczarz — Anna Burns
  3. Ja, które nie poznałam mężczyzn — Jacqueline Harpman
  4. Pas Ilmarinena — Marcin Mortka

Vitest: Jak sprawdzić czy funkcja rzuciła wyjątkiem?

Opublikowano: 30.01.2025 - tagi: JavaScript Vitest Testowanie Test Wyjątek TypeScript

Testowanie wyjątków w Vitest

Mamy prostą funkcję:

function loadFile(fileName?: string): string {
    if (!fileName) {
        throw new Error('File not exist!');
    }

    return 'Some content';
}

I chcemy stestować, czy funkcja rzuca wyjątek. Można to zrobić to w taki sposób:

import { expect, test } from 'vitest';

test('should check file not exist', () => {
    expect(() => loadFile()).toThrowError('File not exist!');
});

Testowanie wersji asynchronicznej

Jak stestować wersją asynchroniczną?

function loadFile(fileName?: string): Promise<string> {
    if (!fileName) {
        throw new Error('File not exist!');
    }

    return Promise.resolve('Some content')
}

Test:

import { expect, test } from 'vitest';

test('should check file not exist', async () => {
    await expect(async () => await loadFile()).rejects.toThrowError('File not exist!');
});

Podsumowanie: Grudzień 2024

Opublikowano: 31.12.2024 - tagi: Blog Podsumowanie Grudzień 2024

W grudniu opublikowałem 2 wpisy:


NodeJS:

  1. Co zrobić, aby działały ścieżki absolutne w Vitest?
  2. Jak pisać testy dla operacji na plikach z Vitest?

Przeczytałem 1 książkę:

  1. Na własne ryzyko — Nassim Nicholas Taleb

Przesłuchałem 4 audiobooki:

  1. Północna Droga. Trzy młode pieśni — Elżbieta Cherezińska
  2. Lot — Lynn Steger Strong
  3. Wyjście z cienia — Janusz A. Zajdel
  4. Miasteczko Twin Falls — Loreth Anne White

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');
});