2014-12-04 2 views
2

두려운 MySql을 모방 한 단위 테스트를 작성하는 중 오류가 발생했지만 내 모의 객체가 올바르게 응답하는 데 문제가 있습니다. 어쩌면 누군가 내가 잘못하고있는 것을 볼 수 있습니다.PDOException 클래스가 응답하지 않습니다.

private function getMockGoneAway() 
{ 
    $e = $this->getMockBuilder('PDOException') 
     ->disableOriginalConstructor() 
     ->setMethods([ 
      'getMessage', 
      'getCode', 
     ]) 
     ->getMock(); 

    $e->expects($this->any()) 
     ->method('getMessage') 
     ->willReturn('SQLSTATE[HY000]: General error: 2006 MySQL server has gone away'); 

    $e->expects($this->any()) 
     ->method('getCode') 
     ->willReturn('HY000'); 

    return $e; 
} 

이것은 테스트입니다. 문제는 그것이 어디서 발생하든 getMessage 또는 getCode에서 의도 한 결과를 반환하는 mock 예외를 얻을 수 없다는 것입니다.

public function testBeginTransactionGoneAway() 
{  
    // get a mock PDO object that overrides beginTransaction method 
    $mock_pdo = $this->getMockPdo(['beginTransaction']); 

    // grab a mock gone-away exception object 
    $mock_gone_away_exception = $this->getMockGoneAway(); 

    die("MSG: ".$mock_gone_away_exception->getMessage()); 

    // setup mock pdo responses 
    $mock_pdo->expects($this->once()) 
     ->method('beginTransaction') 
     ->will($this->throwException($mock_gone_away_exception)); 

    $this->db->replaceConnection($mock_pdo); 
    $this->db->begin(); 
} 

답변

2

그래서 이것을 알아 냈습니다. 기본 예외 클래스는 getMessage 및 getCode를 final로 선언합니다. PHPUnit은 어떤 이유로 PHP가 이러한 메소드를 재정의 할 수 없다는 사실을 사용자에게 알려주지 않습니다. 모의 PDO 클래스와 마찬가지로 PDOException 클래스도 수동으로 조롱해야합니다.

class MockPDOException extends \PDOException 
{ 
    public function __construct($msg, $code) { 
     $this->message = $msg; 
     $this->code = $code; 
    } 
} 

이제 당신은 그래서 재미를 제외하고 제대로

$mock_gone_away_exception = new MockPDOException('SQLSTATE[HY000]: General error: 2006 MySQL server has gone away','HY000'); 

// setup mock pdo responses 
$mock_pdo->expects($this->once()) 
    ->method('beginTransaction') 
    ->will($this->throwException($mock_gone_away_exception)); 

을 모방 할 수 있습니다. PHPUnit에 대해 매일 더 많은 것을 배우십시오. 왜 이것이 나쁜 생각인지에 대한 의견을 환영합니다.

관련 문제