我在使用composers psr-4自动加载功能和PHPUnit时遇到了问题。问题出现在我的本地机器以及TravisCI构建上。单元测试无法找到我的类,而普通脚本可以。
任何配置都肯定有问题,但我不知道我做错了什么。提前感谢您的帮助。
以下是我的项目文件结构:
- 公众/
- src/
- http/
- urlhelper.php
- lib.php
- http/
- 测试/
- 黑色领带/
- http/
- urlhelper.test.php
- lib.test.php
- http/
- 引导程序.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,它也使用了区分大小写的文件系统,是吗?
希望我能帮助遇到同样问题的人。