2012-05-15 21 views
8

yılında ArrayAccess uygulayan bir sınıfın bir nesne stubbing (o mysqli genişletir) Ben için bir test paketi yazıyorum sınıfın yapıcı geçerli:alaycı/PHPUnit İşte

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 sınıf yapıcısı geçirilen

class Config implements arrayaccess{...} 

nasıl/saplama Config nesne alay ediyorsun: php yerleşik arrayaccess arabirimini uygular? Hangisini kullanmalıyım ve neden?

Şimdiden teşekkürler!

cevap

15

Bir diziden kolayca bir Config örneği oluşturabilirseniz, bu benim tercihim olur. Ünitelerinizi, pratikte, Config gibi basit ortak çalışanların testte kullanmak için yeterince güvenli olması gerektiğinde izole olarak test etmek istersiniz. Ayarlanacak kod muhtemelen eşdeğer sahte nesneden daha kolay okunacak ve yazılacak (daha az hataya açık) olacaktır. söyleniyor

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

, sadece başka herhangi bir nesne olarak ArrayAccess uygulayan bir nesne alay.

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

Ayrıca erişimin belirli bir düzen empoze etmek at kullanabilirsiniz, ancak bu şekilde testi çok kırılgan yapacağız.

+0

Harika cevap, teşekkürler! – AndyPerlitch

+0

Bunu yapmak bile kolaylaştırabilir, ancak bir dizi kullanarak :-) –