fix: показывать вывод программы студента на панели «вывод»#392
Merged
Conversation
Тесты выводных уроков глушили вывод: $this->expectOutputString($expected) буферизует stdout студента и молча отбрасывает после assertSame. PHPUnit переиздаёт только «неожиданный» вывод, а expectOutputString делает его «ожидаемым» → на панель он не попадал (студент видел только отчёт). Централизовали перехват в src/TestCase.php: require Solution.php оборачиваем в ob_start/ob_get_clean и печатаем перехваченное через fwrite(STDOUT) в обход буфера PHPUnit — так оно попадает на панель. Добавили хелперы assertOutput() и assertOutputOf() (для уроков, где вывод даёт вызов функции). В выводных тестах expectOutputString → assertOutput; deterministic переведён с getActualOutputForAssertion на assertOutput, два Group-B (define-function, while) — на assertOutputOf. Аналог фиксов Python (#370) и JavaScript (#853). Возвратные уроки и курс Java не менялись. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Документированы назначение класса, $solutionOutput, setUp() (перехват вывода решения и печать его на панель через fwrite(STDOUT)), assertOutput() и assertOutputOf() — с акцентом на неочевидную механику вывода на панель. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Проблема
На панели «вывод» в PHP-уроках студент не видел результат своего кода — только отчёт pretty-print (Collision) и зелёную цитату. Аналог уже починенного в Python (#370) и JavaScript (#853).
Панель показывает дословный stdout от
make test(→ PHPUnit). Тесты «выводных» уроков глушили вывод строкой:PHPUnit буферизует stdout студента, сверяет через
assertSameи молча отбрасывает. Обратно в терминал PHPUnit печатает только «неожиданный» вывод, аexpectOutputStringделает вывод «ожидаемым» → на панель он не попадает.Решение
Централизованно в
src/TestCase.php(там решение и так подключается черезrequire):require Solution.phpв собственныйob_start()/ob_get_clean()— вывод студента попадает в наш буфер (не в буфер PHPUnit, поэтому нет «risky» приfailOnRisky=true);fwrite(STDOUT, …)— в обход буферизации PHPUnit → попадает на панель (аналогprint(out)сcapsys.disabled()в Python и снятого мока в JS);assertOutput($expected)(сверка с выводом изrequire) иassertOutputOf(callable, $expected)— для уроков, где вывод даёт вызов функции.В тестах:
expectOutputString→assertOutput;35-calling-functions/270-deterministic:getActualOutputForAssertion()→assertOutput(перехват переехал в базовый класс);40-define-functions/100-define-function,50-loops/10-while), где тест вызывает функцию решения →assertOutputOf(fn () => …, $expected).Наглядно (урок
10-hello-world):expectOutputString)Hello, World!+ отчётОбласть изменений
src/TestCase.php— перехват +fwrite(STDOUT)+ хелперы.SolutionTest.php— переход на новые хелперы.Не менялись: «возвратные» уроки (проверяют возвращаемое значение функции — вывода нет) и курс Java (там вывод уже доходит до панели, правка не нужна).
Проверка
Hello, World!, многострочный heredoc, countdown, случайное число deterministic).make compose-test— вся сюита зелёная (72 урока).make compose-code-lint(php-cs-fixer check) — без ошибок (exit 0).🤖 Generated with Claude Code