2012-05-15 15 views
8

Đây là constructor của lớp tôi đang viết một bộ kiểm tra cho (nó mở rộng mysqli):Mocking/Stubbing một Object của một lớp mà thực hiện ArrayAccess trong 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'] 
    ); 
} 

Lớp Config truyền cho constructor thực hiện các giao diện arrayaccess tích hợp sẵn trong php:

class Config implements arrayaccess{...} 

làm thế nào để chế nhạo/cuống đối tượng Config? Tôi nên sử dụng cái nào và tại sao?

Cảm ơn trước!

Trả lời

15

Nếu bạn có thể dễ dàng tạo một ví dụ Config từ một mảng, đó sẽ là sở thích của tôi. Trong khi bạn muốn thử nghiệm các đơn vị của mình trong sự cô lập, nơi các cộng tác viên thực tế, đơn giản như Config phải đủ an toàn để sử dụng trong thử nghiệm. Mã để thiết lập nó có lẽ sẽ dễ đọc và dễ viết hơn (ít bị lỗi hơn) so với đối tượng giả tương đương.

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

Điều đó đang được nói, bạn thử một đối tượng thực hiện ArrayAccess giống như bất kỳ đối tượng nào khác.

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

Bạn cũng có thể sử dụng at để đặt hàng truy cập cụ thể nhưng bạn sẽ làm bài kiểm tra rất dễ vỡ theo cách đó.

+0

Câu trả lời hay, cảm ơn! – AndyPerlitch

+0

Bạn thậm chí có thể làm điều đó easire, nhưng bằng cách sử dụng một mảng :-) –

Các vấn đề liên quan