2016-08-25 112 views
4

我给作曲家自动加载一些phpunit测试类的尝试,我似乎无法得到它的工作。当我从命令行运行phpunit时,出现“PHP Fatal Error:Class ... not found”。作曲家phpunit psr-4自动载入类没有找到

我会给我所有的结构和文件信息,所以希望有人会发现我出错的地方。

结构(削减到相关的文件):

composer.json 
composer.lock 
phpunit.xml 
    vendor/ 
    tests/ 
     functional/ 
      BaseTestCase.php 
      HomepageTest.php 

composer.json

{ 
"require": { 
    "php": ">=5.5.0", 
    "slim/slim": "^3.1", 
    "slim/php-view": "^2.0", 
    "monolog/monolog": "^1.17" 
}, 
"require-dev": { 
    "phpunit/phpunit": ">=4.8 < 6.0" 
}, 
"autoload-dev": { 
    "psr-4": { 
     "Tests\\": "tests/" 
    } 
} 
} 

phpunit.xml

<?xml version="1.0" encoding="utf-8" ?> 
<phpunit colors="true" bootstrap="vendor/autoload.php"> 
    <testsuites> 
     <testsuite name="Initial tests"> 
      <directory>tests/</directory> 
     </testsuite> 
    </testsuites> 
</phpunit> 

测试/功能/ BaseTestCase.php

<?php 
namespace Tests\Functional; 

use Slim\App; 
use Slim\Http\Request; 
use Slim\Http\Response; 
use Slim\Http\Environment; 

class BaseTestCase extends \PHPUnit_Framework_TestCase 
{ 
    ... 

测试/功能/ HomepageTest.php

<?php 
namespace Tests\Functional; 

class HomepageTest extends BaseTestCase 
{ 
    ... 

我然后跑更新刷新自动加载文件

$ composer update 

Loading composer repositories with package information 
Updating dependencies (including require-dev) 
Nothing to install or update 
Writing lock file 
Generating autoload files 

然后我试图运行PHPUnit并获得一类未找到错误:

$ vendor/bin/phpunit 

PHP Fatal error: Class 'Tests\Functional\BaseTestCase' not found in <project-root>/tests/functional/HomepageTest.php on line 6 

只是为了彻底,我试着以另一种方式刷新自动加载文件,以防万一:

$ composer dump-autoload 

Generating autoload files 
[email protected]:~/clients/ctest/dev$ 

我还检查了供应商/作曲家/ autoload_psr4.php以确保测试引用正在设置,它是。

... 
Tests\\' => array($baseDir . '/tests'), 
... 

我疯狂Google搜索,但不知道我哪里出错了。

+2

尝试将目录名称“功能”更改为“功能”。 –

回答

5

命名空间目录区分大小写。你必须在文件夹重命名为Functional

正如PSR-4 documentation说:

The subdirectory name MUST match the case of the sub-namespace names.

+0

愚蠢的错误:(很明显,看不到树林的木材,我想我不得不把这个问题当成愚蠢的纪念碑,谢谢! – Finglish

+0

@英国人请接受答案。 –

0

我也有类似的问题,但没有语法问题。 只要我添加了第二个ClassTest(下面的ModelTwoTest.php),Fixtures.php类就自动装载了。如果我删除1个modelTest,则只有剩余的ModelTest自动加载而无需Fixtures。奇怪的行为。

src/ 
tests/ 
     Models/ 
      ModelOneTest.php 
      ModelTwoTest.php <--- 
     Fixtures/ 
      Fixtures.php