一旦我发布它,就无法使用PHPUnit测试PHP包

时间:2017-02-21 12:24:34

标签: php phpunit composer-php autoload

我使用PHP 5.6创建了一个简单的PHP库。 它包括PHPUnit测试用例,我成功创建了包。 然后我发现我可以在其他项目中使用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. 如果是,那么任何解决方案都可以解决这个问题吗?在这两种环境中还有其他方法可以自动加载问题吗?
  4. Repo in Github

    Screenshot

1 个答案:

答案 0 :(得分:2)

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

对我来说

cd vendor/phpunit/phpunit && composer install && phpunit =&gt;工作
cd doctrine/collections/ && composer install && phpunit =&gt;工作

所以它似乎应该适合你。

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

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

看起来你的文件并没有那么不同。您确定从供应商文件夹内的packages目录中运行了composer install吗?

更新

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

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

require区块中:

"Jthedev/Validators": "dev-master"

然后我跑了

composer update

运行正常。你需要运行composer update并检查新的composer.lock,因为它已经过时了。

从那里我进入你的回购目录。

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
它会浪费大量的空间和带宽。相反,composer获取所有依赖项并将它们安装在单独的文件夹中,并且它们彼此协同工作,因为composer使用vendor/autoload.php 为该项目加载它们。您正在谈论的是在vendor/your-project内创建供应商文件夹。这是不正常的 - 通常你只需要在自己开发时运行测试,但无论如何你的问题是如何在项目被添加为另一个项目的依赖项时为你的项目运行测试。

要执行此操作,您需要vendor/your-project目录中运行中的composer install ,这意味着:

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

最后更新(希望如此)

来自聊天:

只有在项目目录中运行composer install时才会生成自动装带器。你是对的,供应商文件夹通常不应该存在,但如果你想做你想做的事情,你需要它。这不常见。通常开发人员在他们的项目根文件夹中运行他们的测试,而不是依赖项,但是你的问题是&#34;当它是一个依赖项时,我怎么能运行我的测试&#34;。答案是您需要在项目文件夹中创建供应商和自动加载文件

只有在项目文件夹中运行composer install时才会运行测试。但如果测试没有这样做就不会有问题。