Skip to content

fix: показывать вывод программы студента на панели «вывод»#853

Merged
fey merged 2 commits into
mainfrom
fix/output-panel-stdout
Jul 2, 2026
Merged

fix: показывать вывод программы студента на панели «вывод»#853
fey merged 2 commits into
mainfrom
fix/output-panel-stdout

Conversation

@fey

@fey fey commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Проблема

На панели «вывод» в JS-уроках студент не видел результат своего кода — только отчёт vitest. Аналог уже починенного в Python (exercises-python#370).

Панель показывает дословный stdout от make test (→ vitest). Тесты «выводных» уроков глушили вывод строкой:

vi.spyOn(console, 'log').mockImplementation(() => {})

Она записывает вызовы в spy.mock.calls (поэтому assert работает и задание засчитывается), но подменяет console.log пустышкой — реальной печати нет.

Решение

Двухчастное:

  1. Сняли .mockImplementation(() => {}) в 44 test.js. vi.spyOn(console, 'log') без реализации и записывает вызовы (assert цел), и вызывает настоящий console.log.
  2. Добавили disableConsoleIntercept: true в vitest.config.js. Иначе vitest перехватывает консоль и печатает с префиксом stdout | test.js > <тест>. С флагом вывод идёт в stdout чисто — прямой аналог pytest --capture=no.

Наглядно (урок 10-hello-world):

вариант панель
было (мок) (только отчёт vitest)
мок снят, без флага stdout | test.js > hello world
Hello, World!
мок снят + disableConsoleIntercept Hello, World!

Предметные имена тест-кейсов (второй коммит)

Имя теста в каждом из 71 test.js приведено к теме урока — слаг каталога без числового префикса, дефисы → пробелы ('hello world', 'string concatenation', 'if', 'while', 'define function'…). Раньше было 'hello world' у выводных и разрозненные 'test'/'mirror'/'printNumbers'. Теперь на панели заголовок кейса отражает тему урока. Это только строка-описание — на assert не влияет.

Область изменений

  • vitest.config.js — одна опция.
  • 44 test.js — снятие мока (паттерн байт-в-байт единообразен), включая 2 урока с вызовом функции (40-define-functions/100-define-function, 50-loops/10-while).
  • 71 test.js — предметное имя кейса.

Не менялись по существу: 27 невыводных test.js (проверяют возвращаемое значение) и 10-basics/20-comments — только имя кейса.

Проверка

  • Чистый вывод на всех типах уроков (Hello, World!, многострочный, countdown); заголовок кейса — тема урока (✓ test.js > if, ✓ test.js > while).
  • make compose-test — вся сюита зелёная.
  • make compose-code-lint (tsc --build + biome) — без ошибок (exit 0; warnings в biome.json — pre-existing, не относятся к правке).

🤖 Generated with Claude Code

fey and others added 2 commits July 2, 2026 17:04
Тесты выводных уроков глушили console.log студента строкой
vi.spyOn(console, 'log').mockImplementation(() => {}): вызовы писались в
spy.mock.calls (поэтому assert работал и задание засчитывалось), но
настоящей печати не было — на панели «вывод» студент своего результата
не видел.

Сняли .mockImplementation(() => {}) в 44 test.js — шпион теперь и
записывает вызовы (assert цел), и вызывает настоящий console.log.
Добавили disableConsoleIntercept: true в vitest.config.js, чтобы вывод
шёл в stdout чисто, без служебного префикса vitest (stdout | test.js > ...).
Это прямой аналог pytest --capture=no из фикса Python.

Невыводные уроки (проверяют возвращаемое значение) и 10-basics/20-comments
не менялись.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Имя теста в каждом из 71 test.js теперь равно слагу урока (каталог без
числового префикса, дефисы → пробелы): 'hello world', 'string concatenation',
'if', 'while', 'define function' и т.д. Раньше было 'hello world' у выводных
и разрозненные 'test'/'mirror'/'printNumbers'. Теперь на панели «вывод»
заголовок кейса отражает тему урока. Только строка-описание, на assert не влияет.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@fey fey force-pushed the fix/output-panel-stdout branch from f1cf921 to c6a6fc4 Compare July 2, 2026 13:24
@fey fey merged commit d627d1e into main Jul 2, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant