2012-05-15 16 views
8

Aquí está el constructor de la clase Estoy escribiendo un banco de pruebas para (que se extiende mysqli):que imita/Stubbing un objeto de una clase que implementa ArrayAccess en 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 clase Config pasa al constructor implementa la interfaz arrayaccess integrado en php:

class Config implements arrayaccess{...} 

¿Cómo se burlan/ramal del objeto Config? ¿Qué debería usar y por qué?

¡Gracias de antemano!

Respuesta

15

Si usted puede crear fácilmente una instancia Config de una matriz, que sería mi preferencia. Si bien desea probar sus unidades de forma aislada donde sea práctico, los colaboradores simples como Config deben ser lo suficientemente seguros como para usar en la prueba. El código para configurarlo probablemente será más fácil de leer y escribir (menos propenso a errores) que el objeto simulado equivalente.

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

Dicho esto, te burlas de un objeto que implementa ArrayAccess al igual que lo haría con cualquier otro objeto.

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

También puede utilizar at para imponer un orden específico de acceso, pero vas a hacer la prueba muy frágil de esa manera.

+0

¡Gran respuesta, gracias! – AndyPerlitch

+0

Incluso podrías hacerlo fácil, pero usando una matriz :-) –

Cuestiones relacionadas