PHPUnit的Composer自动加载失败


Composer autoloading fails for PHPUnit

我在使用composers psr-4自动加载功能和PHPUnit时遇到了问题。问题出现在我的本地机器以及TravisCI构建上。单元测试无法找到我的类,而普通脚本可以

任何配置都肯定有问题,但我不知道我做错了什么。提前感谢您的帮助。

以下是我的项目文件结构:

  • 公众/
  • src/
    • http/
      • urlhelper.php
    • lib.php
  • 测试/
    • 黑色领带/
      • http/
        • urlhelper.test.php
      • lib.test.php
    • 引导程序.php
    • testcase.php
  • .travis.yml
  • composer.json
  • init.php
  • phpunit.xml

以下是我的composer.json的样子:

{
    "require": {
        "php": ">=5.4.0",
        "nesbot/carbon": "1.*",
        "ext-pdo": "*",
        "predis/predis": "1.1.*@dev"
    },
    "require-dev": {
        "satooshi/php-coveralls": "dev-master",
        "phpunit/phpunit": ">=3.7"
    },
    "autoload": {
        "psr-4": {
            "BlackTie''": "src/blacktie"
        }
    }
}

PHPUnit配置定义了一个引导程序,每个require_once包括一个由主项目共享的脚本,以及初始化psr-4自动加载器的测试和常见函数:init.php

define('ROOT', __DIR__);
// Composer-Autoloader
require_once "vendor/autoload.php";
// Framework library with common functions
require_once "src/blacktie/lib.php";

Travis的命令行说:

PHP致命错误:在第38行的/home/travis/build/jazzschmidt/black-tie/tests/BlackTie/Http/UrlHelper.test.PHP中找不到类"BlackTie''Http''UrlHelper"

正如您所发现的,为了使代码在Linux系统上正常工作,您需要使用正确的类名。

它在mac上本地工作的原因是OSX没有完全区分大小写的文件系统。尽管它保留了文件和目录的大小写,但它将大小写不同的文件名解析为相同的存储路径,例如

$ touch foo.txt
$ touch Foo.txt
$ ls -l
total 0
-rw-r--r--  1 danack  admin  0 18 Oct 16:32 foo.txt
$ touch Bar.txt
$ touch bar.txt
$ ls -l
total 0
-rw-r--r--  1 danack  admin  0 18 Oct 16:32 Bar.txt
-rw-r--r--  1 danack  admin  0 18 Oct 16:32 foo.txt

它类似地认为预合成和去合成版本的字符是相同的。即é(U+00E9)是e(U+0065)和组合锐音符(U+0301)

这方面的一个例子可以通过PHP更容易地显示:

<?php
touch("Am'xC3'xA9lie.txt");
touch("Am'x65'xCC'x81lie.txt");

结果生成了一个名为"Amélie.txt"的文件。

尽管一开始这可能看起来很疯狂,但这意味着应用程序不需要担心字符的分解,而且你不会突然发现一个应用程序用一种表示保存文件,然后另一个应用将其保存为不同的表示。

我真遗憾-我错过了作曲家自动加载功能来处理区分大小写的文件。因此,为了在Travis上运行测试,我只需要调整文件和目录的名称。但我不明白,为什么它在我的本地机器上运行OSX,它也使用了区分大小写的文件系统,是吗?

希望我能帮助遇到同样问题的人。