Repository navigation
Перенести node --test тесты vueManager на vitest с проверкой поведения #692
Description
Задача
Перенести четыре теста из 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.
Критерии приёмки
- Тесты, проверяющие поведение компонентов, монтируют их, а не читают исходник
- Тесты на чистые функции и composables просто переехали на vitest без потери смысла
- Каталог
vueManager/tests/либо пуст и удалён вместе со скриптомtest:smoke, либо в нём осознанно остаётся то, что не требует DOM - Если
test:smokeудаляется — соответствующий шаг убран из.github/workflows/ci.yml - Регрессии Настройки: двойной confirm удаления — ungrouped ConfirmDialog во всех 7 гридах вкладок (инстанс #539) #548 и [Bug] Не удаляется способ доставки через «Действия» в гриде (двойной confirm) #630 по-прежнему покрыты, но проверяются поведением
Контекст
- [Testing] Roadmap автоматического покрытия: PHPStan в CI, PHPUnit, интеграционные тесты #429 — roadmap тестового покрытия, откуда пришёл vitest
- test(unit): RepeaterFieldService pipeline + clampComputedTotal #493 — PR, добавивший vitest и happy-dom
- Настройки: двойной confirm удаления — ungrouped ConfirmDialog во всех 7 гридах вкладок (инстанс #539) #548 / [Bug] Не удаляется способ доставки через «Действия» в гриде (двойной confirm) #630 — баги, ради которых писались текстовые тесты
Activity