2012-05-15 7 views
8

Вот конструктор класса я пишу тестовый набор для (он расширяет MySQLi):Mocking/гася объектом класса, который реализует ArrayAccess в PHPUnit

function __construct(Config $c) 
{ 
    // store config file 
    $this->config = $c; 

    // do mysqli constructor 
    parent::__construct(
     $this->config['db_host'], 
     $this->config['db_user'], 
     $this->config['db_pass'], 
     $this->config['db_dbname'] 
    ); 
} 

Config класса передается в конструктор реализует интерфейс arrayaccess встроенных в PHP:

class Config implements arrayaccess{...} 

Как поиздеваться/заглушкой Config объекта? Что я должен использовать и почему?

Заранее благодарен!

ответ

15

Если вы можете легко создать экземпляр Config из массива, это было бы моим предпочтением. Хотя вы хотите протестировать свои подразделения изолированно, где это возможно, простые сотрудники, такие как Config, должны быть достаточно безопасными для использования в тесте. Код для его настройки, вероятно, будет легче читать и писать (менее подвержен ошибкам), чем эквивалентный макет.

$configValues = array(
    'db_host' => '...', 
    'db_user' => '...', 
    'db_pass' => '...', 
    'db_dbname' => '...', 
); 
$config = new Config($configValues); 

Это, как говорится, вы издеваться объект, реализующий ArrayAccess так же, как и любой другой объект.

$config = $this->getMock('Config', array('offsetGet')); 
$config->expects($this->any()) 
     ->method('offsetGet') 
     ->will($this->returnCallback(
      function ($key) use ($configValues) { 
       return $configValues[$key]; 
      } 
     ); 

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

+0

Отличный ответ, спасибо! – AndyPerlitch

+0

Вы могли бы сделать это просто, но используя массив :-) –

Смежные вопросы