PHPUnit и автозагрузчики: определение, выполняется ли код в тестовой области? - PullRequest
1 голос
/ 31 марта 2010

Предпосылка

Я знаю, что написание кода, действующего по-разному во время выполнения теста, - это очень плохая практика, но, возможно, я действительно сталкивался со сценарием, в котором это может быть необходимо.

В частности, я пытаюсь протестировать очень специфическую оболочку для HTML Purifier в среде Zend - а точнее View Helper. Автозагрузчик HTML Purifier необходим, потому что он использует логику, отличную от тех автозагрузчиков, которые у нас есть.

Проблема

require () -ing автозагрузчик в верхней части моего класса View Helper, дает мне следующее в тестовой области действия :

Регистратор автозагрузчика HTML Purifier не совместим с нестатическими объектными методами из-за PHP Ошибка # 44144; Пожалуйста, не используйте HTMLPurifier.autoload.php (или любой другой файл, который включает этот файл); вместо этого поместите код: spl_autoload_register (массив ('HTMLPurifier_Bootstrap', 'автозагрузка')) после ваших собственных автозагрузчиков.

Замена require () на spl_autoload_register(array('HTMLPurifier_Bootstrap', 'autoload')) как объявлено означает, что тест проходит нормально, но View Helper умирает ужасной смертью, заявляя:

Zend_Log [3707]: ErrorController перехватил LogicException «Пропущенный массив не указывает существующий статический метод (класс 'HTMLPurifier_Bootstrap' не найден)"

(Наша структура папок для тестирования немного отличается от нашей структуры папок Zend по необходимости.)

Вопрос (ы)

После работы с ним, я думаю, мне нужно будет выбрать загрузку автозагрузчика в зависимости от того, находятся ли объекты в тестовой области или нет.

  1. Есть ли у меня еще один вариант включения процедуры автозагрузки HTMLPurifier в обоих случаях, которые я не вижу из-за туннельного зрения?

  2. Если нет, то должен ли я найти способ различать тестовую среду и производственную среду с помощью моего собственного кода (например, APPLICATION_ENV) - или PHPUnit поддерживает эту чудовищную мою хакерскую установку, устанавливая константу что я мог проверить, было ли это определено () , или подобные махинации? (Мой Google-фу здесь слабый! Я, вероятно, просто делаю это неправильно.)

Ответы [ 2 ]

3 голосов
/ 31 марта 2010

HTML Purifier имеет свой код автозагрузки, помещенный в файл, отличный от HTMLPurifier.auto.php; а именно HTMLPurifier_Bootstrap. У него есть два метода: автозагрузка, которая на самом деле выполняет автозагрузку, а также метод getPath, который не включает вставленный файл, сообщает вам, где файл будет. Этот файл явно предназначен для самостоятельной работы.

К сожалению, я не квалифицирован, чтобы говорить о коде Зенда. Возможно, вам удастся просто выполнить дополнительное включение в Bootstrap, прежде чем пытаться выполнить код. Надеюсь, это поможет!

1 голос
/ 31 марта 2010

Что ж, хотя вы правы в отношении требований к схожести (если не к идентичности) между производственной и тестовой средой - у меня все еще несколько другая конфигурация. Я имею в виду, что начальная загрузка загружает различные разделы из application.ini, и поэтому я могу просто передать флаг, чтобы включить / выключить sth (как эта функция автозагрузчика):

1) У меня есть тест SetEnv APPLICATION_ENV в моем .htaccess (может быть производство, разработка, подготовка). Вы также можете иметь это в своих конфигах apache. 2) Когда Zend_Config загружает application.ini - он загружает его в соответствии с get_env ('APPLICATION_ENV') - так что разные разделы для разных сценариев (я, конечно, полагаюсь на Zend_Application, но он достаточно умен, чтобы понять среду) 3) Я всегда могу добавить флаг в соответствующий раздел и проверить его по коду.

Надеюсь, это немного поможет.

...