Настройка переменных среды внутри модульных тестов PHP


Я провожу базовое модульное тестирование функции полезности, которую я сделал много лет назад, но она включает доступ к массиву $_SERVER.

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

Это хорошо работает с использованием бегунов GitLab, потому что в файле .gitlab-ci.yml я просто делаю что-то вроде:

before_script:
  - export SERVER_PORT="80"
  - export SERVER_NAME="gitlab"

В настоящее время мой тест не может проверить все операторы этой функции, поскольку он проверяет значение $_SERVER['SERVER_NAME'].

Единица измерения Тест

public function testGetEnvironment() {
    shell_exec('set SERVER_NAME="localhost"');
    $this->assertEquals("localhost", $this->util->get_environment());

    shell_exec('set SERVER_NAME="gitlab"');
    $this->assertEquals("gitlab", $this->util->get_environment());
}

ПРИМЕЧАНИЕ: Мне пришлось использовать set, так как я на машине с Windows, в то время как наш бегун GitLab находится на машине с Linux, поэтому я использовал export в файле gitlab-ci.yml.

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

Обновление

Вот сообщение об ошибке:

1) UtilTest::testGetEnvironment
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'localhost'
+'gitlab'
Author: Mureinik, 2018-09-18

1 answers

Любая выполняемая вами команда оболочки будет отдельным процессом и не повлияет на запущенный процесс. Поскольку вы модульно тестируете, как функция будет использовать переменную $SERVER, вам не нужно проходить через все хлопоты, связанные с тем, как она будет установлена в "реальном" сценарии - просто вручную измените ее и протестируйте свою функцию:

public function testGetEnvironment() {
    $SERVER["SERVER_NAME"] = "localhost";
    $this->assertEquals("localhost", $this->util->get_environment());

    $SERVER["SERVER_NAME"] = "gitlab";
    $this->assertEquals("gitlab", $this->util->get_environment());
}
 2
Author: Mureinik, 2018-09-18 19:41:39