答案可能很简单,但我一直在兜圈子,却找不到任何答案。 我正在尝试模拟最后一堂课,如果不做一些额外的工作,这通常是不可能的。我已经看到了多种选择,例如实现接口并模拟它。但这会徒劳地增加额外的工作,所以我寻找一种方法来绕过这个问题。我找到的解决方案是 dg/bypass-finals。我只需要做一件事来实现它。尽早执行这行代码:
DG\BypassFinals::enable();
经过一番挖掘,我发现最好的方法是使用钩子并将其注册到 phpunit.xml 文件中。所以我创建了如下所示的钩子:
<?php declare(strict_types=1);
use DG\BypassFinals;
use PHPUnit\Runner\BeforeTestHook;
final class BypassFinalHook implements BeforeTestHook
{
public function executeBeforeTest(string $test): void
{
BypassFinals::enable();
}
}
并在xml文件中添加了所需的文本:
<phpunit bootstrap="vendor/autoload.php">
<extensions>
<extension class="BypassFinalHook"/>
</extensions>
</phpunit>
但是每次当我尝试运行命令“php ./vendor/bin/phpunit”时。我不断收到相同的错误“类“BypassFinalHook”不存在”。我尝试通过在 xml 文件的扩展元素中添加文件参数来添加文件位置,但随后它说它没有打开流的权限。所以我很茫然。我需要做什么才能找到班级?是否需要保存在某个位置?目前,我只是将它放在根文件夹中,但我在多个位置尝试过,结果仍然相同。
对我有用的是将
BypassFinalHook
放入 tests\Hook\BypassFinalHook.php
。
将此名称空间声明添加到
tests\Hook\BypassFinalHook.php
namespace tests\Hook;
将此声明添加到
phpunit.xml
:
<extensions>
<extension class="Tests\Hook\BypassFinalHook"/>
</extensions>
这为我解决了问题。
事件订阅者系统,您可以使用以下内容
添加例如tests/BypassFinalsExtension.php
:
<?php
declare(strict_types=1);
namespace Tests;
use PHPUnit\Runner\Extension\Extension;
use PHPUnit\Runner\Extension\Facade;
use PHPUnit\Runner\Extension\ParameterCollection;
use PHPUnit\TextUI\Configuration\Configuration;
class BypassFinalsExtension implements Extension
{
public function bootstrap(Configuration $configuration, Facade $facade, ParameterCollection $parameters): void
{
$facade->registerSubscriber(new BypassFinalsExtensionStart);
}
}
还添加订阅者,例如在 tests/BypassFinalsExtensionStart.php
:
<?php
declare(strict_types=1);
namespace Tests;
use DG\BypassFinals;
use PHPUnit\Event\TestRunner\ExecutionStarted;
use PHPUnit\Event\TestRunner\ExecutionStartedSubscriber;
class BypassFinalsExtensionStart implements ExecutionStartedSubscriber
{
public function notify(ExecutionStarted $event): void
{
BypassFinals::enable(true, true);
}
}
在phpunit.xml
中将
<bootstrap class="Tests\BypassFinalsExtension" />
添加到
<extensions>
,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit>
....
<extensions>
<bootstrap class="Tests\BypassFinalsExtension" />
</extensions>
</phpunit>