发布后无法使用 PHPUnit 测试 PHP 包

Can't test the PHP package using PHPUnit, once I publish it

我使用 PHP 5.6 创建了一个简单的 PHP 库。 它包括 PHP 单元测试用例,我成功地创建了包。 然后我发现我也可以在其他项目中使用 composer 直接从 GitHub 安装这些包。我可以 运行 在开发阶段独立测试。但是一旦我发布了包,我就无法 运行 测试,因为它没有正确找到自动加载器文件。

<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="vendor/autoload.php"
     colors="true"
     processIsolation="false"
     stopOnFailure="false"
     syntaxCheck="false"
     convertErrorsToExceptions="true"
     convertNoticesToExceptions="true"
     convertWarningsToExceptions="true"
     testSuiteLoaderClass="PHPUnit_Runner_StandardTestSuiteLoader">

<testsuites>
    <testsuite>
        <directory>tests</directory>
    </testsuite>
</testsuites>

我在根目录中添加了 xml 文件。独立时自动加载文件的路径是正确的。但是安装后目录结构会有所不同

如果我们使用 require_once 自动加载器文件,问题仍然存在,因为安装后目录结构发生变化。

问题:

  1. 我们可以在将包安装到任何框架 (laravel/Symfony) 或任何其他项目中后对其进行测试吗?
  2. 最佳做法是什么?使用该包的开发者是否需要测试?
  3. 如果是,那么有什么解决办法吗?是否有任何其他方法可以在两种环境中自动加载问题?

Repo in Github

我会说你最好看看其他存储库,看看它是否有效。

对我来说

cd vendor/phpunit/phpunit && composer install && phpunit => 有效
cd doctrine/collections/ && composer install && phpunit => 有效

看来它应该适合你。

如果您查看他们使用的其他供应商的 phpunit.xml.dist

bootstrap="./tests/Doctrine/Tests/TestInit.php"(学说)
bootstrap="tests/bootstrap.php" (phpunit)

看起来你的文件并没有太大不同。您确定 运行 composer install 来自 vendor 文件夹内的 packages 目录吗?

更新:

我将你的存储库添加为默认 Symfony 安装的依赖项。

"repositories": [
    {
        "url": "https://github.com/jerintk/Validator.git",
        "type": "git"
    }
],

并且在 require 块中:

"Jthedev/Validators": "dev-master"

然后我运行

composer update

它运行 很好。您需要 运行 作曲家更新并签入新的 composer.lock,因为它已经过时了。

从那里我进入了你的 repo 目录。

cd vendor/Jthedev/Validators

然后我运行

composer install

vendor/phpunit/phpunit/phpunit

得到了

OK (2 tests, 2 assertions)

更新二

(因为评论太长了)

@JTheDev composer update 为 laravel 项目添加依赖项,但不会在 vendor/your-project 目录中创建 vendor 文件夹。如果 composer 为每个项目单独安装所有依赖项,例如:

vendor/
  my-project/
    vendor/
      dependency-A
      dependency-C
  another-library/
    vendor/
      dependency-A
      dependency-B

它会浪费很多 space 和带宽。相反,composer 获取所有依赖项并将它们安装在单独的文件夹中,并且它们相互协作,因为 composer 使用 vendor/autoload.php 为该项目 加载它们。您所说的是在 vendor/your-project 中创建 vendor 文件夹。这是不正常的 - 通常你只需要 运行 开发自己的测试,但无论如何你的问题是关于如何 运行 当你的项目被添加为另一个项目的依赖项时你的测试。

为此,您需要 运行 composer install inside vendor/your-project 目录,这意味着:

cd vendor/Jthedev/Validators && composer install && vendor/phpunit/phpunit/phpunit

最终更新(希望如此)

来自聊天:

仅当您 运行 在项目目录中安装 composer 时才会生成自动加载器。你是对的,供应商文件夹通常不应该在那里,但如果你想做你想做的事情,你需要它。这不是传统的。通常开发人员 运行 他们在项目根文件夹中进行测试,而不是依赖项,但您的问题是 "how can I run my tests when it is a dependency"。答案是您需要在项目文件夹中创建供应商和自动加载文件

如果您 运行 composer 安装在项目文件夹中,则测试仅 运行。但是,如果测试不这样做就没有问题 运行。