Я столкнулся с проблемами при использовании функции автозагрузки psr-4 и PHPUnit. Проблемы возникают на моей локальной машине, а также на сборках TravisCI. Модульные тесты не могут найти мои классы, в то время как нормальные скрипты делают.
Конечно, что-то не так с любой из конфигураций, но я не могу понять, что я сделал не так. Заранее спасибо за помощь.
Вот структура файла моих проектов:
Вот что мой 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";
Командная строка Трэвиса говорит:
Неустранимая ошибка PHP: класс ‘BlackTie \ Http \ UrlHelper’ не найден в /home/travis/build/jazzschmidt/black-tie/tests/blacktie/http/urlhelper.test.php строке 38
Как вы узнали, чтобы ваш код работал правильно в системах 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) — это е (U + 0065) и сочетающий острый акцент (U + 0301)
Пример этого можно продемонстрировать с помощью PHP:
<?php
touch("Am\xC3\xA9lie.txt");
touch("Am\x65\xCC\x81lie.txt");
В результате создается один файл с именем Amélie.txt.
Хотя поначалу это может показаться сумасшедшим, это означает, что приложениям не нужно беспокоиться о разложении символов, и вы вдруг не обнаружите, что одно приложение сохраняет файл с одним представлением, а затем другое приложение сохраняет его как другое представление.
Позор мне — я упустил, что функция автозагрузки композиторов обрабатывает файлы с учетом регистра. Таким образом, чтобы запустить тесты на Travis, мне нужно было только настроить имена файлов и каталогов.
Но я не могу понять, почему это работает на моей локальной машине под управлением OS X, которая также использует чувствительную к регистру файловую систему, не так ли?
Надеюсь, я смогу помочь кому-то, кто испытывает ту же проблему.