3
votes

I am trying to use PhpUnit with Composer. In this purpose I did:

1 Added phpunit to req composer section:

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

2 Installed what needed:

php composer.phar install --dev

Operation finished with success.

Installing phpunit/phpunit (3.7.6) Downloading: 100%

Unfortunately when I want to run the tests, I get

./vendor/bin/phpunit PHP Fatal error: Call to a member function add() on a non-object in /home/serek/php/project/tests/bootstrap.php on line 12

Problem occurs because return ComposerAutoloaderInit::getLoader(); in vendor/autoload returns NULL into test bootstrap.

Any idea how can it be solved without hacking Loader?

Code: 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 (here I need only autoloader)

> $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();
1
You are talking about a code fragment that you do not share, adding it to the question might make this easier to understand for others. - hakre
Obviously your test bootstrap throws the error, but you do not show us the code. Might be your assumptions are wrong. - Sven
some file content is attached now - mrok
No idea if that is your issue, but require_once and return values does not make much sense, it perhaps should be require. Also ensure the file is actually returning something. - hakre

1 Answers

11
votes

The issue is that PHPUnit already requires the autoload file, so your require_once call is not executed and therefore the return value is not set (php doesn't keep the return value of require calls so require_once breaks on that use case).

You can safely change it to a require because with recent composer versions the autoloader is not created twice anymore and requiring it many times just returns you the same instance every time.