Skip to content

Перенести node --test тесты vueManager на vitest с проверкой поведения #692

Closed

Description

@biz87

Задача

Перенести четыре теста из vueManager/tests/ с node --test на vitest, переписав их с проверки текста исходников на проверку поведения.

В чём проблема

В vueManager два тест-набора, и они принципиально разного качества.

tests/*.test.js — гоняются через node --test. Node не умеет импортировать .vue, поэтому эти тесты читают компоненты как текст:

function read(name) {
  return fs.readFileSync(path.join(srcRoot, name), 'utf8')
}

и дальше проверяют наличие или отсутствие подстроки в исходнике.

src/**/*.test.js — гоняются vitest с happy-dom, реально монтируют компонент через @vue/test-utils, мокают модули через vi.mock(), проверяют поведение.

Оба набора выполняются в CI (шаги Vitest и Smoke tests в job vueManager lint), так что дело не в покрытии, а в том, что именно проверяется.

Почему это стоит переписать

Тест на текст исходника ловит буквальный откат правки и пропускает семантически эквивалентную переделку, которая вернёт баг.

Показательный пример — settingsGridDeleteHandlers.test.js. Он грепает пять гридов на отсутствие confirm.require внутри delete-хендлеров. Регрессию «вернули второй вызов» поймает. А рефакторинг, который вынесет тот же вызов в хелпер или переименует метод, тест пройдёт — и двойное подтверждение удаления вернётся незамеченным.

То же самое с settingsConfirmGroups.test.js: он проверяет наличие строки confirmGroup в файлах, но не то, что группы действительно изолируют диалоги друг от друга. А именно это и было сутью бага #548 — из-за модульного синглтона ConfirmationEventBus негруппированный вызов доходил до всех диалогов на странице.

Почему они такими получились

Не по недосмотру. Набор tests/ нарастал стихийно, по тесту на каждый починенный баг (#466, #468, #548) — тем инструментом, что был доступен без установки зависимостей.

vitest пришёл позже и централизованно, в рамках roadmap #429 через PR #493, вместе с happy-dom и шагом в CI. То есть инструмент, позволяющий писать нормальные тесты, появился уже после того, как эти четыре были написаны.

Что переносить

Файл Что проверяет сейчас Чем заменить
settingsConfirmGroups.test.js наличие строки confirmGroup в пяти гридах смонтировать два грида на одной странице, вызвать удаление в одном, проверить, что диалог открылся ровно один
settingsGridDeleteHandlers.test.js отсутствие confirm.require в теле хендлеров смонтировать грид, кликнуть удаление, проверить один диалог и реальный вызов request.delete
requestUnwrap.test.js нужно посмотреть вероятно, чистая функция — возможно, достаточно просто перенести в vitest без переписывания
useStaleRequestGuard.test.js нужно посмотреть composable, кандидат на прямой перенос

Последние два, судя по названиям, могут быть тестами на чистую логику — тогда перенос сводится к смене раннера, без изменения сути. Проверить перед началом.

Ориентир

src/components/ResourceCategoryTree.test.js — хороший образец того, как выглядит настоящий компонентный тест в этом проекте: мок request.js через vi.mock, заглушки PrimeVue-компонентов, монтирование через хост-компонент, замыкающий реальный цикл v-model.

Критерии приёмки

Контекст

Activity

  1. added
    priority: lowНизкий приоритет, когда будет время
    javascriptPull requests that update javascript code
    tech-debtMaintainability / refactor / architecture debt
    on Sep 9, 2026
  2. self-assigned this
    on Sep 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

javascriptPull requests that update javascript codepriority: lowНизкий приоритет, когда будет времяtech-debtMaintainability / refactor / architecture debt

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions