【问题标题】:Where do I need to place a hook for phpunit?我需要在哪里放置 phpunit 的钩子?
【发布时间】:2022-05-03 20:38:41
【问题描述】:

答案可能很简单,但我一直在兜圈子,到处都找不到答案。 我正在尝试模拟最终课程,如果不做一些额外的工作,这通常是不可能的。我已经看到了多种选择,比如实现一个接口并模拟它。但这会毫无意义地创造额外的工作,所以我寻找一种绕过问题的方法。我找到的解决方案是 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 类是在命名空间中定义的?如果是这种情况,您需要将类属性替换为class="Some\Namespace\BypassFinalHook"。如果没有,您可以尝试将属性file="path/to/BypassFinalHook.php" 添加到&lt;extension&gt; 标记中。
  • 我已经这样做了,但是它说它没有打开steam的权限。

标签: php phpunit


【解决方案1】:

对我有用的是将BypassFinalHook 放入tests\Hook\BypassFinalHook.php

将此命名空间声明添加到tests\Hook\BypassFinalHook.php

namespace tests\Hook;

将此声明添加到phpunit.xml:

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

这为我解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    相关资源
    最近更新 更多