Автозагрузка Composer не выполняется для PHPUnit

Я столкнулся с проблемами при использовании функции автозагрузки psr-4 и PHPUnit. Проблемы возникают на моей локальной машине, а также на сборках TravisCI. Модульные тесты не могут найти мои классы, в то время как нормальные скрипты делают.

Конечно, что-то не так с любой из конфигураций, но я не могу понять, что я сделал не так. Заранее спасибо за помощь.

Вот структура файла моих проектов:

  • общественности /
  • SRC /
    • HTTP /
      • urlhelper.php
    • lib.php
  • Тесты /
    • черный галстук/
      • HTTP /
        • urlhelper.test.php
      • lib.test.php
    • bootstrap.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";

Командная строка Трэвиса говорит:

Неустранимая ошибка PHP: класс ‘BlackTie \ Http \ UrlHelper’ не найден в /home/travis/build/jazzschmidt/black-tie/tests/blacktie/http/urlhelper.test.php строке 38

0

Решение

Как вы узнали, чтобы ваш код работал правильно в системах 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.

Хотя поначалу это может показаться сумасшедшим, это означает, что приложениям не нужно беспокоиться о разложении символов, и вы вдруг не обнаружите, что одно приложение сохраняет файл с одним представлением, а затем другое приложение сохраняет его как другое представление.

1

Другие решения

Позор мне — я упустил, что функция автозагрузки композиторов обрабатывает файлы с учетом регистра. Таким образом, чтобы запустить тесты на Travis, мне нужно было только настроить имена файлов и каталогов.
Но я не могу понять, почему это работает на моей локальной машине под управлением OS X, которая также использует чувствительную к регистру файловую систему, не так ли?

Надеюсь, я смогу помочь кому-то, кто испытывает ту же проблему.

0