2012-05-15 11 views
8

Oto konstruktor klasy Piszę zestaw testów dla (rozszerza mysqli):Mocking/stubbing obiekt klasy, która implementuje ArrayAccess w 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'] 
    ); 
} 

Klasa Config przekazany do konstruktora implementuje interfejs arrayaccess wbudowany w PHP:

class Config implements arrayaccess{...} 

Jak mogę Mock/odgałęzienie przedmiotem Config? Którego powinienem użyć i dlaczego?

Z góry dziękuję!

Odpowiedz

15

Jeśli możesz łatwo utworzyć instancję Config z tablicy, byłby to mój wybór. Podczas gdy chcesz przetestować swoje jednostki w odosobnieniu, gdzie są praktyczne, zwykli współpracownicy, tacy jak Config, powinni być wystarczająco bezpieczni, aby użyć ich w teście. Kod do ustawienia będzie prawdopodobnie łatwiejszy do odczytu i zapisu (mniej podatny na błędy) niż równoważny obiekt próbny.

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

Mając na uwadze powyższe, należy drwić obiekt wykonawczych ArrayAccess tak samo jak każdy inny przedmiot.

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

Można również użyć at narzucać konkretnej kolejności dostępu, ale można zrobić test bardzo kruche w ten sposób.

+0

Świetna odpowiedź, dzięki! – AndyPerlitch

+0

Możesz nawet zrobić to łatwo, ale używając tablicy :-) –

Powiązane problemy