#php #phpunit
Вопрос:
Ответ, вероятно, очень прост, но я бегал по кругу и нигде не мог найти ответа. Я пытаюсь издеваться над заключительным классом, что обычно невозможно без дополнительной работы. Я видел несколько вариантов, таких как реализация интерфейса и насмешка над этим. Но это создало бы дополнительную работу впустую, поэтому я искал способ обойти проблему. Решение, которое я нашел, было dg/обход-финал. Мне нужно было сделать только 1 вещь, чтобы реализовать это. Выполните эту строку кода как можно раньше:
DGBypassFinals::enable();
После некоторых раскопок я выяснил, что лучший способ сделать это-использовать крючок и зарегистрировать это в phpunit.xml файл. Поэтому я создал свой крючок, который выглядит так:
lt;?php declare(strict_types=1); use DGBypassFinals; use PHPUnitRunnerBeforeTestHook; final class BypassFinalHook implements BeforeTestHook { public function executeBeforeTest(string $test): void { BypassFinals::enable(); } }
И добавил необходимый текст в xml-файл:
lt;phpunit bootstrap="vendor/autoload.php"gt; lt;extensionsgt; lt;extension class="BypassFinalHook"/gt; lt;/extensionsgt; lt;/phpunitgt;
Но каждый раз, когда я пытаюсь запустить команду «php ./vendor/bin/phpunit». Я продолжаю получать одну и ту же ошибку «Класс «Обходной крючок» не существует». Я попытался добавить местоположение файла, добавив параметр file в элемент расширения xml-файла, но затем он сказал, что у него нет разрешений на открытие потока. Так что я в растерянности. Что мне нужно сделать, чтобы он нашел класс? Требуется ли его сохранять в определенном месте? В настоящее время он просто находится в корневой папке, но я пробовал его в нескольких местах и все равно получил тот же результат.
Комментарии:
1. Это потому, что класс BypassFinalHook определен в пространстве имен? Если это так, вам нужно заменить атрибут класса на
class="SomeNamespaceBypassFinalHook"
. Если нет, вы можете попробовать добавить атрибутfile="path/to/BypassFinalHook.php"
вlt;extensiongt;
тег.