e0ipso/drupal-unit-autoload

允许您在非标准未知文件位置加载类。

1.0.0 2015-07-03 11:12 UTC

This package is auto-updated.

Last update: 2024-08-24 03:55:12 UTC


README

Coverage Status Build Status Scrutinizer Code Quality

Gitter

Drupal 单元自动加载

您是否想为 Drupal 7 模块添加 PHPUnit 测试?是的,您应该这样做。这个工具旨在帮助您处理在您的 Drupal 安装中自动加载类。

问题

主要问题是当您正在测试的类或代码依赖于其他模块中声明的类或 Drupal 核心本身时。

想象一下,您正在测试您的 Car 类。这个类依赖于 \DrupalCacheInterface(您正在使用一个必须实现该接口的模拟缓存提供者),并且还依赖于服务容器模块中的几个类。最后,您在 Car 类中注入服务以便之后可以模拟它们,这可能需要您在测试期间可访问 Drupal\service_container\

由于您正在进行单元测试,您可能不希望引导 Drupal 以使数据库可用,以便能够在注册表中查找所有这些类。

此时,您可能会想“我只是使用 Composer 的自动加载器并定义类和命名空间的位置”。这就是您意识到 Drupal 允许您在许多位置安装 contrib 模块。这使得无法与您需要的相对路径一起提供模块。

想象一下这种情况

  • 我们的自定义模块(将进行单元测试的那个模块)安装在 sites/example.org/modules/contrib/racing_modules/car
  • 依赖于 car 模块的模块安装在
    • sites/all/modules/essentials/service_container.
    • sites/default/modules/contrib/dependency.

如果您想提供指向 includes/cache.inc 的路径以使 \DrupalCacheInterface 可用,那么您需要添加一个类似这样的路径:../../../../../../includes/cache.inc。但假设有人决定在 sites/all/modules/car 中安装您的 car 模块?您在模块中提供的路径在这种情况下将不起作用。正确的路径应该是 ../../../includes/cache.inc。基本上,每个网站安装可能需要不同的路径。

该项目旨在解决的问题是为您提供一个在所有这些场景中都能正常工作的单一路径的方法。

解决方案

认识 Drupal 单元自动加载。要包含它,只需将以下内容添加到您的 PHPUnit 测试类中(根据您的测试类位置更改路径)

require_once __DIR__ . '/../../vendor/e0ipso/drupal-unit-autoload/autoload.php';

这将加载 Composer 的自动加载器 + Drupal 功能。

您需要做的唯一一件事是在 composer.json 中添加一个带占位符的路径键。

在您的单元测试所在文件夹中,您需要一个具有以下内容的 composer.json 文件

{
  "require-dev": {
    "phpunit/phpunit": "4.7.*",
    "mockery/mockery": "0.9.*",
    "e0ipso/drupal-unit-autoload": "1.0.*"
  },
  "autoload": {
    "psr-0": {
       This is usual Composer business},
    "psr-4": {
       This is usual Composer business 
      "Drupal\\service_container\\": "DRUPAL_CONTRIB<service_container>/src",
      "Drupal\\Core\\": [
        "DRUPAL_CONTRIB<service_container>/lib/Core",
        "DRUPAL_CONTRIB<contrib>/src/DrupalCore"
      ]
    },
    "class-location": {
      "\\DrupalCacheInterface": "DRUPAL_ROOT/includes/cache.inc",
      "\\ServiceContainer": "DRUPAL_CONTRIB<service_container>/lib/ServiceContainer.php",
      "\\Drupal": "DRUPAL_CONTRIB<service_container>/lib/Drupal.php"
    }
  }
}

在该文件夹上运行 composer install 将下载 PHPUnit、Mockery 以及您用于测试的所有工具。这还包括下载本项目,这就是 "e0ipso/drupal-unit-autoload": "0.1.*" 的作用。

此时,您只需要在 composer 文件中添加带有 DRUPAL_ROOTDRUPAL_CONTRIB<modulename> 的路径。

您有两种选择

  • 使用 autoload 中的新键 class-location 提供类名和它们所在的文件。
  • 提供psr-4和psr-0命名空间前缀以及它们映射的路径。这与composer所做的非常相似,但增加了寻找Drupal根目录和 contrib模块安装位置的功能。

在您提供的路径中,您可以使用两个标记: DRUPAL_ROOTDRUPAL_CONTRIB。这些标记将被扩展到它们所代表的真实路径。这样,提供 DRUPAL_CONTRIB 可以在某个Drupal安装中扩展为

  • /var/www/docroot/sites/all/modules/ctools
  • 在另一个安装中为 /User/Sites/drupal-site/sites/default/modules/contrib/ctools

需要注意的是,您的代码携带相同的 标记化 路径供所有人使用,而不关心依赖项安装的位置。