PHPUnit, суперглобальные переменные. Как настроить тест так, чтобы $_SERVER и $_GET были установлены правильно?

Я пишу код PHP для анализа входящих URL-адресов. Он сильно зависит от глобальных переменных PHP, таких как $_SERVER и $_GET. Я думаю о том, чтобы вручную настроить их в функции модульного теста PHPUnit setUp(). Есть ли лучший способ сделать это?


person Community    schedule 08.03.2010    source источник


Ответы (1)


Идея заключалась бы в том, чтобы обернуть $_SERVER и $_GET в классы вместо прямого доступа к ним, чтобы вам не приходилось полностью на них полагаться. Вы часто видите этот подход в общих фреймворках. Таким образом, вы можете легко заглушить или имитировать запрос без необходимости настраивать состояние суперглобальных переменных.

Пример такого класса будет здесь: https://codereview.stackexchange.com/questions/73515/http-request-response-class

person Gordon    schedule 08.03.2010
comment
Не могли бы вы привести пример, как настроить состояние суперглобальных переменных без обёртки? (Хоть и вонючий) - person JayIsTooCommon; 03.07.2017
comment
@JayIsTooCommon вы просто устанавливаете их в своем тесте, например. $_SERVER[foo] = 42, если я правильно помню. Можно сделать это в самом тестовом методе или в setup() или в setupbeforeclass() (если он все еще существует в настоящее время) - person Gordon; 04.07.2017
comment
Ах, хорошо, тогда я, должно быть, делаю что-то еще не так. Спасибо :) - person JayIsTooCommon; 04.07.2017
comment
Я знаю, что эта ветка немного устарела, но у меня есть вопрос: даже если вы оберните глобальные переменные $_SERVER, $_GET и т. д. в класс, вам все равно придется тестировать класс, который использует эти переменные и возвращает данные от них. Не могли бы вы привести пример класса упаковки? - person tonix; 10.08.2018
comment
@tonix добавил ссылку на пример класса. При этом вы просто сделаете новый Request($_GET, $_POST, …) в производстве, а в своем тесте вы вместо этого будете использовать new Request([], [], …), например. вы бы передали массивы, содержащие то, что, как ожидается, будет содержать ваши $_GET, $_POST и т. д. - person Gordon; 10.08.2018
comment
Спасибо! Я посмотрю на это! - person tonix; 10.08.2018