2012-05-15 1 views
8

에 arrayaccess를 구현하는 클래스의 객체를 스텁은 (는 mysqli 확장) 나는에 대한 테스트 스위트를 작성하고있는 클래스의 생성자입니다 :비웃음/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'] 
    ); 
} 

Config 클래스는 생성자에 전달

class Config implements arrayaccess{...} 

가 어떻게/스터브 Config 객체 조롱 않습니다 : PHP에 내장 된 arrayaccess 인터페이스를 구현? 어떤 것을 사용해야하며 그 이유는 무엇입니까?

미리 감사드립니다.

답변

15

배열에서 Config 인스턴스를 쉽게 만들 수 있다면 그것은 내가 선호하는 것입니다. 실용적인 곳에서 유닛을 개별적으로 테스트하려는 경우 Config과 같은 간단한 공동 작업자가 테스트에 사용할만큼 안전해야합니다. 그것을 설정하는 코드는 상응하는 mock 객체보다 읽기 쉽고 쓰기 쉽습니다 (에러가 발생하기 쉬운). 말했다되고 그건

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

, 당신은 당신이 다른 모든 개체로 ArrayAccess를 구현하는 객체를 조롱.

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

또한 특정 액세스 순서를 부과하는 at를 사용할 수 있지만 그런 식으로 테스트가 매우 부서지기 쉬운 만들 수 있습니다.

+0

위대한 답변, 감사합니다! – AndyPerlitch

+0

당신은 심지어 그것을 할 수 있지만, 배열을 사용하여 :-) –