为什么我的 Drupal PHPUnit 测试似乎无法自动加载共享测试夹具/实用程序类?

Why can't my Drupal PHPUnit test seem to autoload a shared test fixture/utility class?

提问人:GuyPaddock 提问时间:11/9/2023 更新时间:11/9/2023 访问量:16

问:

在我的 Drupal 10.x 项目中,我有一个测试试图模拟我创建的供多个测试使用的类(称之为 )。代码如下所示:Drupal\Tests\my_module\MyTestObject

protected function setUpMocks(): void {
  $myMockObject = $this->createMock(MyTestObject::class);
}

我已经检查了类的名称、定义它的文件的名称以及该文件的整个目录路径,但无论如何,我都会收到以下错误:

PHPUnit\Framework\MockObject\UnknownTypeException: Class or interface "Drupal\Tests\my_module\Utilities\MyTestObject" does not exist

此外,如果我在扩展该类的测试类之上定义了一个抽象类(见下文),那么 PHP 会指示它找不到基类:

namespace Drupal\Tests\my_module\Functional;

use Drupal\Tests\my_module\Utilities\MyTestObject;

// PHP fails to locate the MyTestObject base class.
abstract class SomeClass extends MyTestObject {
}

/**
 * My functional tests.
 */
class SomeTest extends BrowserTestBase {
  // ...
}

为什么这个类不自动加载?似乎PHP可以找到几乎相同的软件包中的其他测试类,而不会出现问题。

php symfony drupal composer-php phpunit

评论


答:

0赞 GuyPaddock 11/9/2023 #1

我大约 95% 确定答案在于.此方法在运行时向类装入器动态注册每个扩展(模块、主题、配置文件等)的名称空间。根据以下代码片段,该方法仅期望在特定于每种测试类型的顶级文件夹下查找与测试相关的代码,因此代码必须存在于以下路径之一中才能正确自动加载:\Drupal\Core\Test\TestDiscovery::registerTestNamespaces()

      $this->testNamespaces["Drupal\\Tests\\$name\\Unit\\"][] = "$base_path/tests/src/Unit";
      $this->testNamespaces["Drupal\\Tests\\$name\\Kernel\\"][] = "$base_path/tests/src/Kernel";
      $this->testNamespaces["Drupal\\Tests\\$name\\Functional\\"][] = "$base_path/tests/src/Functional";
      $this->testNamespaces["Drupal\\Tests\\$name\\Build\\"][] = "$base_path/tests/src/Build";
      $this->testNamespaces["Drupal\\Tests\\$name\\FunctionalJavascript\\"][] = "$base_path/tests/src/FunctionalJavascript";

      // Add discovery for traits which are shared between different test
      // suites.
      $this->testNamespaces["Drupal\\Tests\\$name\\Traits\\"][] = "$base_path/tests/src/Traits";

由于我的类位于命名空间中(保存在磁盘上为 ),因此它不在其中一个测试命名空间下,因此该文件不符合自动加载的条件。将类移动到工作中,就像将类放在测试安装的模块中一样。因此,如果您想在单元测试和功能测试之间共享测试夹具,则需要注意这一点。Drupal\Tests\my_module\Utilitiesweb/modules/custom/my_module/tests/src/Utilities/MyTestObject.phpDrupal\Tests\my_module\Functional\Utilitiessrc/