TGViewer
Андруша пишет код Андруша пишет код @xavescor_code · 1.33K subscribers
Post #170 1.38K
Блеск и нищета опенсорса

Jest и Vitest - это лидирующие решения для юнит тестирования js/ts кода. Но вокруг них сложилась удивительная и непонятная для меня ситуация.

Давайте глянем на ESLint. Это решение максимально расширяемо. Его документация хорошо описана и существует множество плагинов, которые прекрасно расширяют его функциональность. И сообщество использует ESLint как раз за то, что он расширяем: каждый человек может написать свой плагин. И разработчики ESLint прислушиваются к тому что нужно сообществу.

А теперь давайте глянем на наших лидеров:
Что нам нужно от расширения jest/vitest. В 99% случаев нам понадобится написать собственный matcher. Это та штука, которая пишется expect().ВОТ_ТУТ(). И в таком случае начинается веселье:
- У тебя есть только описание того как просто сделать expect.extend
- У тебя описывается как максимально примитивно добавить типы. У Playwright, к примеру, матчеры различаются в зависимости от того что ты передаёшь в expect. У vitest'a все матчеры находятся в единой помойке. Типизация тут помогает минимально.
- У тебя попросту нет доступа из матчеров к конфигу. Соврал, нет НОРМАЛЬНОГО доступа к конфигу.
И эту сиутацию я хочу рассмотреть.

Вот у меня есть задача: написать снепшотилку директорий. Не важно что это такое. Важно то, что мне нужно получать доступ к флагу -u, который в vitest позволяет понять хочет пользователь сравнить снепшоты или же обновить их.
И делается это очень просто: никак. Точнее, никак это не описано в документации. Но зато нам даётся ссылка на jest плагин, который позволяет делать снепшоты: https://vitest.dev/guide/snapshot#image-snapshots. И тут может возникнуть мысль: "Эврика! В jest'e всё можно сделать, а vitest просто перенёс к себе эти решения".
Ну, часть вывода будет верна: Vitest перенёс решения. Но это не решения, а костыли. В jest так же ничего не описывается.

В итоге все кто пишут плагины к jest, тупо завязываются на внутренние апи. К примеру, флаг -u - это простое выражение expect.getState().snapshotState._updateSnapshot === 'all'. И да, _updateSnapshot - это приватное поле. Приватное поле на уровне типов. И даже в 2019 году было issue, чтобы сделать апи нормальным: https://github.com/jestjs/jest/issues/8732
Но, ничего не изменилось.

И это фигня. Часть апи, к примеру, лежит тупо в global: https://github.com/americanexpress/jest-image-snapshot/blob/da49e578c9a02c50aa841d05ac64e9ffd4b725fd/src/index.js#L193
Всё апи jest'a и vitest'a - это набор костылей, которые можно найти только с помощью метода тыка.


Итог: jest плюёт на расширяемость. Vitest занимается тем, что переносит костыли jest'a и так же плюёт на расширяемость. Так и живём.
vitest.dev Next generation testing framework powered by Vite
  • 👍 22
  • 💩 4
  • 🤡 3
  • 🖕 1
More from @xavescor_code
  1. Sep 29, 2026https://x.com/thsottiaux/status/2104823812042940713 Ну, впервые в жизни ванганул, и походу…
  2. Sep 24, 2026Тут в моём казахстанском пузыре происходит прикольная вещь. Ща, в пятницу, в кз обьявлен т…
  3. Sep 22, 2026Чуть чуть проснусь от спячки по важному поводу. Мы походу пришли к AGI в ЛЛМках. Ну, точне…
  4. Aug 6, 2026Уже почти месяц прошел после взлома моделями OpenAI – HuggingFace. Спустя это время каждая…
  5. Jul 28, 2026https://t.me/denissexy/11581 Знаете, меня очень сильно удивляет вопрос: какого чёрта подоб…
  6. Jul 28, 2026Антропик: китайцы дистилируют наши модели, надо забанить их Опенаи: китайцы дистилируют на…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →