使用composer和phpunit找不到类'sample \ question2 \ Hello'

时间:2016-01-12 13:53:09

标签: php phpunit composer-php

我使用composer和phpunit,但出现错误“Class not found”。

目录结构:

  • php_sample /样品/问题/
  • php_sample /样品/问题/ Hello.php
  • php_sample /样品/问题/测试/ HelloTest.php

并创建了composer.json

{
    "require-dev": {
    "phpunit/phpunit": "4.5.*"
    }
}

我安装了这样的作曲家。

$ curl -sS https://getcomposer.org/installer | php
$ ./composer.phar update
$ ./composer.phar install --dev

Hello.php是这样的。

<?php
namespace sample\question;

class Hello
{
    public function hello()
    {
        return 'Hello, world';
    }
}

?>

test / HelloTest.php是这样的。

<?php
namespace sample\question\tests;

use sample\question\Hello;

class HelloTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var Hello
     */
    public $SUT;

    /**
     * @test
     */
    public function canPrint()
    {
        $this->assertThat($this->SUT->hello(), $this->equalTo('Hello, world'));
    }

    protected function setUp()
    {
        $this->SUT = new Hello;
    }
}

然后,我运行此脚本并发生错误。

$ vendor/bin/phpunit --bootstrap vendor/autoload.php tests/HelloTest.php


PHP Fatal error:  Class 'sample\question\Hello' not found in /Users/foobar/work/php_sample/sample/question/tests/HelloTest.php on line 32

如果你回答我会很棒。

1 个答案:

答案 0 :(得分:2)

您正在使用--bootstrap vendor/autoload.php正确引导PHPUnit以通过Composer生成的自动加载器自动加载文件,但

您的composer.json文件错过了autoloadautoload-dev部分。

{
    "require-dev": {
        "phpunit/phpunit": "4.5.*"
    }
    "autoload": {
         "psr-4": {"sample\\question\\": "php_sample/sample/question/"}
    }
    "autoload-dev": {
         "psr-4": {"sample\\question\\tests\\": "php_sample/sample/question/tests/"}
    }
}

然后只使用composer dump-autoload重新转储/重新生成Composer Autoloader。

旁注:我不确定文件夹结构是否真的有效..

将项目文件夹布局更改为:

可能值得
project/src
project/tests

project/src/sample/question/
project/tests/sample/question/

然后它变成

"autoload": {
    "psr-4": {"sample\\question\\": "src/"}
}
"autoload-dev": {
    "psr-4": {"sample\\question\\tests\\": "tests/"}
}