2012-05-15 5 views
8

Hier implementiert ist der Konstruktor der Klasse I für eine Testsuite schreibe (es Mysqli erweitert):Mocking/ein Objekt einer Klasse Stubbing, die 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'] 
    ); 
} 

Die Config Klasse an den Konstruktor übergeben implementiert die arrayaccess Schnittstelle zu pHP eingebaut:

class Config implements arrayaccess{...} 

Wie ich Mock/Stub die Config Objekt tun? Welchen sollte ich verwenden und warum?

Vielen Dank im Voraus!

Antwort

15

Wenn Sie einfach eine Config Instanz aus einem Array erstellen können, wäre das meine Präferenz. Während Sie Ihre Einheiten isoliert testen möchten, wo es praktisch ist, sollten einfache Mitarbeiter wie Config sicher genug sein, um sie im Test zu verwenden. Der Code zum Einrichten ist wahrscheinlich einfacher zu lesen und zu schreiben (weniger fehleranfällig) als das äquivalente Mock-Objekt.

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

aber sagen, dass verspotten Sie ein Objekt der Umsetzung ArrayAccess nur wie jedes andere Objekt.

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

Sie können auch at verwenden, um eine bestimmte Reihenfolge des Zugangs zu verhängen, aber Sie werden den Test sehr spröde auf diese Weise machen.

+0

Große Antwort, danke! – AndyPerlitch

+0

Sie könnten es sogar einfacher machen, aber mit einem Array :-) –