2012-05-15 3 views
8

Ecco il costruttore della classe sto scrivendo una suite di test per (si estende mysqli):Mocking/stubbing un oggetto di una classe che implementa ArrayAccess in 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'] 
    ); 
} 

La classe Config passata al costruttore implementa l'interfaccia arrayaccess costruito in PHP:

class Config implements arrayaccess{...} 

Come faccio a deridere/stub dell'oggetto Config? Quale dovrei usare e perché?

Grazie in anticipo!

risposta

15

Se è possibile creare facilmente un'istanza Config da un array, questa sarebbe la mia preferenza. Mentre vuoi testare le tue unità in isolamento, dove semplici e pratici collaboratori come Config dovrebbero essere abbastanza sicuri da utilizzare nel test. Il codice per configurarlo sarà probabilmente più facile da leggere e scrivere (meno soggetto ad errori) rispetto all'equivalente oggetto mock.

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

Detto questo, è un oggetto che implementa deridi ArrayAccess proprio come si farebbe con qualsiasi altro oggetto.

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

È inoltre possibile utilizzare at di imporre un ordine specifico di accesso, ma potrai fare il test molto fragile in quel modo.

+0

Ottima risposta, grazie! – AndyPerlitch

+0

Si potrebbe anche farlo easire, ma usando un array :-) –