PHPUnit. Протестировать ветку кода, которая зависит от настроек php.ini, неизменяемых в runtime

241
01 марта 2017, 22:37
Предыстория

На некоторых "не_очень_хороших" хостингах любят безальтернативно отключать некоторые функции через php.ini. В частности иногда полезную parse_ini_file. В своем проекте (легковесный скелет api) обошел таким образом:

if (function_exists('parse_ini_file')) {
    self::$settings = parse_ini_file(PROPERTIES);
    return;
}
$content = preg_grep("/^[\w .]+=.*/", explode(PHP_EOL, file_get_contents(PROPERTIES)));
foreach ($content as $row) {
    $row                    = strstr($row . ';', ';', true);
    $key                    = trim(strstr($row, '=', true), " \n\r");
    $value                  = trim(strstr($row, '=', false), " \"=\n\r");
    self::$settings[ $key ] = $value;
}
Вопрос

Как мне теперь прикрутить PHPUnit для тестирования куска кода с рукописным парсером?

Идеально было бы задисейблить ее в рантайме, но можно ли это сделать я как-то инфы не нашел.

PS Собственно я нахожусь в самом начале изучения PHPUnit и, возможно, есть true way, которого просто не знаю.

Answer 1

Зашел с черного хода.

Вынес самописный парсер в отдельный приватный метод

private static function loadSettings() {
    self::$settings = function_exists('parse_ini_file')
        ? parse_ini_file(PROPERTIES)
        : self::loadSettingsHard();
}
private static function loadSettingsHard() {
    $settings = [];
    $content  = preg_grep("/^[\w .]+=.*/", explode("\n", file_get_contents(PROPERTIES)));
    foreach ($content as $row) {
        $row              = strstr($row . ';', ';', true);
        $key              = trim(strstr($row, '=', true), " \n\r");
        $settings[ $key ] = trim(strstr($row, '=', false), " \"=\n\r");
    }
    return $settings;
}

В тестовом методе применил грязный хак с Reflection

public function testGetConfigValueHard() {
    $method = new ReflectionMethod(
        Config::class, 'loadSettingsHard'
    );
    $method->setAccessible(true);
    $method->invoke(Config::class);
    $this->assertEquals(
        'localhost',
        Config::get('db_host')
    );
}
READ ALSO
json_encode возвращает объект вместо массива

json_encode возвращает объект вместо массива

Если я удаляю из массива с целочисленными индексами элемент, а затем применяю к нему функцию json_encode то получаю строку с JavaScript объектом вместо...

267
Не приходят ообщения из формы обратной связи

Не приходят ообщения из формы обратной связи

PHP не знаю, к сожалениюПытаюсь прикрутить к сайту готовую форму, код которой нашла в сети

252
перечислить все дни с текущей даты

перечислить все дни с текущей даты

нужно вывести все даты начиная с текущей, и не больше 30 дней

173