【问题标题】:Composer cannot load loader when PhpUnit is used使用 PhpUnit 时 Composer 无法加载 loader
【发布时间】:2012-09-29 05:34:41
【问题描述】:

我正在尝试将 PhpUnit 与 Composer 一起使用。为此我做了:

1 将 phpunit 添加到 req composer 部分:

"require": {
    "php": ">=5.3.0"
},
"require-dev": {
    "phpunit/phpunit": "3.7.*"
},
"autoload": {
    "psr-0": {"PhpProject": "src/"}
}

2 安装了需要的东西:

php composer.phar 安装 --dev

操作成功完成。

安装 phpunit/phpunit (3.7.6) 下载:100%

不幸的是,当我想运行测试时,我得到了

./vendor/bin/phpunit PHP 致命错误:调用成员函数 在 /home/serek/php/project/tests/bootstrap.php 中的非对象上添加() 在第 12 行

出现问题是因为 返回 ComposerAutoloaderInit::getLoader();在 vendor/autoload 中将 NULL 返回到测试引导程序中。

知道如何在不破解 Loader 的情况下解决它吗?

代码: phpunnit.xml.dist

> <?xml version="1.0" encoding="UTF-8"?>
> 
> <phpunit bootstrap="tests/bootstrap.php" colors="true">
>     <testsuites>
>         <testsuite name="PhpProject Test Suite">
>             <directory>tests/PhpProject/</directory>
>         </testsuite>
>     </testsuites>
> 
>     <filter>
>         <whitelist>
>             <directory suffix=".php">src/PhpProject/</directory>
>         </whitelist>
>     </filter> </phpunit>

tests/bootstrap.php(这里我只需要自动加载器)

> $loader = require_once __DIR__ . "/../vendor/autoload.php";
> $loader->add('PhpProject\\', __DIR__); //<- this is problematic line 12 (comments has 9 lines) 

/../vendor/autoload.php

// autoload.php generated by Composer
require_once __DIR__ . '/composer' . '/autoload_real.php';
return ComposerAutoloaderInit::getLoader();

【问题讨论】:

  • 您正在谈论您不共享的代码片段,将其添加到问题中可能会让其他人更容易理解。
  • 显然您的测试引导程序会引发错误,但您没有向我们展示代码。可能是你的假设是错误的。
  • 部分文件内容已附加
  • 不知道这是否是您的问题,但require_once 和返回值没有多大意义,它可能应该是require。还要确保文件实际上正在返回一些东西。

标签: php phpunit composer-php


【解决方案1】:

问题是 PHPUnit 已经需要自动加载文件,所以你的 require_once 调用没有执行,因此返回值没有设置(php 不保留 require 调用的返回值,所以 require_once 在那个用例上中断)。

您可以安全地将其更改为require,因为在最近的作曲家版本中,自动加载器不再创建两次,并且需要它多次只会每次都返回相同的实例。

【讨论】:

    猜你喜欢
    • 2017-11-10
    • 2021-06-18
    • 2013-02-17
    • 1970-01-01
    • 2019-01-13
    • 2020-10-07
    • 2021-07-02
    • 2017-06-13
    相关资源
    最近更新 更多