我需要在哪里放置 phpunit 的钩子?

问题描述 投票:0回答:3

答案可能很简单,但我一直在兜圈子,却找不到任何答案。 我正在尝试模拟最后一堂课,如果不做一些额外的工作,这通常是不可能的。我已经看到了多种选择,例如实现接口并模拟它。但这会徒劳地增加额外的工作,所以我寻找一种方法来绕过这个问题。我找到的解决方案是 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 文件的扩展元素中添加文件参数来添加文件位置,但随后它说它没有打开流的权限。所以我很茫然。我需要做什么才能找到班级?是否需要保存在某个位置?目前,我只是将它放在根文件夹中,但我在多个位置尝试过,结果仍然相同。

php phpunit
3个回答
0
投票

对我有用的是将

BypassFinalHook
放入
tests\Hook\BypassFinalHook.php

将此名称空间声明添加到

tests\Hook\BypassFinalHook.php

namespace tests\Hook;

将此声明添加到

phpunit.xml
:

<extensions>
    <extension class="Tests\Hook\BypassFinalHook"/>
</extensions>

这为我解决了问题。


0
投票

对于 phpunit 10.2,子元素称为

bootstrap
,而不是文档中提到的
extension

<extensions> <bootstrap class="Tests\Hook\BypassFinalHook"/> </extensions>
    

0
投票
由于在 phpunit 的更高版本中 Hooks 被替换为

事件订阅者系统,您可以使用以下内容

添加例如

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>
    
© www.soinside.com 2019 - 2024. All rights reserved.