【问题标题】:How do I load the file I need? PHP如何加载我需要的文件? PHP
【发布时间】:2015-04-22 16:43:09
【问题描述】:

虽然这可能是一个基本问题,但可以假设使用 require_once,实际上它比那更复杂 - 至少对我而言。

我遇到的问题是我的项目结构很像 Java 中的包结构。我们如何使用全局名称空间。所以项目结构看起来像:

ProjectName/
  ModuleOne/
    Class.php
    composer.json
    tests/
      phpunit.xml
      bootstrap.php
      Class_test.php

在上面的示例中,Class.php 将被实例化为:ProjectName\ModuleOne\Class();

现在的问题是我们如何设置我们的测试目录,因为Class_test.php 将使用Class.php 和任何其他依赖的类,我需要一些方法来让我在我的测试中实例化有问题的类.每当我尝试时,我都会收到一个错误,说它找不到我要实例化的有问题的类。

虽然这可能是一种不寻常的处理方式,但该项目可以使用 Composer 导出每个模块,并使用我们选择的命名空间自动加载到您的项目中,在本例中为 ProjectName

我似乎遇到的问题是,我需要 tests/ 目录之外的每个类自动加载并准备就绪,这样如果 Class.php 扩展任何其他类,那么当调用 Class.php 时,它将知道,“好的,我需要去这里看看这个其他类是否也存在。”

现在每个模块都有一个composer文件,里面有类似的东西:

  "autoload": {
    "psr-0": {
      "ProjectName\\ModuleOne\\": ""
    }
  },

那么我可以在 bootstrap.php 中使用一些方法来自动加载整个模块以进行测试吗?

【问题讨论】:

  • 你能把 composer 创建的 autoload.php 文件包含在你的 bootstrap.php 中吗?

标签: php phpunit bootstrapping


【解决方案1】:

我不会尝试重新发明轮子,我会采用 composer 建议的包结构。

快速的谷歌搜索给了我这篇博文的链接:How to create a PSR-4 PHP package。它几乎描述了作曲家包的文件结构应该如何以及如何设置和组织包的测试。

希望这会有所帮助。

编辑:

假设你有上面帖子中建议的结构,你需要做的就是告诉 phpunit 在哪里可以找到 composer 创建的自动加载文件。如果您需要更复杂的引导,您可以执行以下操作。创建一个文件tests/bootstrap.php 并添加以下内容:

require_once 'path/to/composer/autoload.php';
// Set up your stubs, mocks etc.

在您的 phpunit.xml 文件中,您需要将 phpunit 指向正确的引导文件,例如:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
     backupStaticAttributes="false"
     bootstrap="tests/bootstrap.php"
     colors="true"
     convertErrorsToExceptions="true"
     convertNoticesToExceptions="true"
     convertWarningsToExceptions="true"
     processIsolation="false"
     stopOnFailure="false"
     syntaxCheck="false">
    <testsuites>
        <testsuite name="Nacho Test Suite">
            <directory suffix=".php">./tests/</directory>
        </testsuite>
    </testsuites>
</phpunit>

或者,您可以使用--bootstrap 标志运行 phpunit,例如:

vendor/bin/phpunit --bootstrap path/to/bootstrap.php

【讨论】:

  • 这实际上是我做事的方式,因为我从 Zend Framework 窃取了我的设置。所以我坚持惯例。我只是没有向您展示我的所有 composer.json 文件。那么你将如何使用与 phpunit 相关的 composer.json 来加载这个模块呢?
  • 如果您的类被 composer 正确自动加载,并且您的测试不需要任何额外的引导,请将 bootstrap="vendor/autoload.php" 添加到您的 phpunit.xml 配置中(如上面链接中的建议)。我将编辑答案以向您展示一个带有额外引导的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
相关资源
最近更新 更多