Тестирование включенных или локальных файлов в PHPUnit

У меня есть простой метод внутри класса, который делает следующее

 class ToBeTested
 {
      public function getLocalSettings()
      {
          require_once 'local.php';

           return (isset($configSetting['foo'])) ? true : false;
      }
 }

в локальном.php

 <?
      $configSetting = array(
           'foo' => '1',
           'bar' => 'false',
      );

Я хочу создать модульный тест для getLocalSettings. Я понимаю, что это похоже на внедрение зависимостей, но я не могу понять, как мне написать тест. Кажется, что довольно тривиальный блок кода слишком усложняется тестами, но у меня есть свобода рефакторинга здесь, и я хочу заменить «local.php» своим собственным поставщиком значений/данных для целей тестирования.

ИЗМЕНИТЬ ДЛЯ ЯСНОСТИ/КОММЕНТАРИЙ

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

Спасибо


person DaOgre    schedule 04.03.2013    source источник


Ответы (1)


Вы должны внедрить свой массив конфигурации в класс ToBeTested либо через конструктор, либо через установщик. Это устранит побочный эффект, вызванный getLocalSettings (включение другого файла), и позволит вам смоделировать настройки во время тестирования. Ваше определение класса может выглядеть так:

class ToBeTested
{
    private $localSettings;

    public function __construct($localSettings)
    { 
        $this->localSettings = $localSettings;
    }
}

Затем, при создании экземпляра этого класса при обычном использовании, вы просто предоставляете массив конфигурации конструктору (включение local.php должно выполняться в коде начальной загрузки). Когда вы хотите провести модульное тестирование класса, вы можете внедрить любой набор настроек, который вам нужен, при его создании, и у вас не будет жесткой зависимости от файловой системы. Вы можете использовать функции поставщика данных в PHPUnit (документация) для этого.

person Lusitanian    schedule 04.03.2013