2012-10-03 3 views
2

저는 우리 시스템이 PHPUnit과 더 호환되도록 노력하여 클래스의 단위 테스트를 더 많이 수행 할 수 있고 모의 객체로 작업하는 일부를 얻을 수있었습니다. 내가 주위를 둘러 볼 수없는 문제를 뛰어 다니며PHPUnit 모의 객체에서 다른 결과 리턴하기

우리가 가지고있는 수업 중 하나는 (모의 버전을 만들고 있습니다) 쿼리를위한 것입니다. 쿼리 문자열을 "query()"메서드에 전달하고 쿼리를 기록한 다음 실행하고 결과를 반환합니다. 또한 mysql_fetch_assoc을 "get_row()"라는 메서드로 래핑하여 원본과 매우 유사한 배열 값을 반환합니다.

일부 메서드에서는 "query()"메서드에 여러 쿼리가 전달되어 결과적으로 여러 개의 while 루프를 실행하여 데이터를 다른 변수에로드해야합니다. 첫 번째 탈출하기 위해

class object{ 
    public function __construct($query){ 
     $this->query = $query; 
    } 

    public function loadData(){ 

     $data1 = queryDataSource("SELECT * FROM data1"); 
     $data2 = queryDataSource("SELECT * FROM data2"); 

     return Array(
      "data1" => $data1, 
      "data2" => $data2, 
     ); 

    } 

    private function queryDataSource($query){ 
     $this->query->query($query) 

     while($row = $this->query->get_row()){ 
      $result[] = $row; 
     } 

     return $result 
    } 
} 

class testObject extends PHPUnit_Framework_TestCase{ 
    method testLoadData(){ 
     $test_data = Array('name' => 'Bob', 'number' => '98210'); 

     $query = $this->getMock('Query'); 
     $query->expects($this->any())->method('query'); 
     $query->expects($this->at(1))->method('get_row')->will($this->returnValue($test_data); 
     $query->expects($this->at(2))->method('get_row')->will($this->returnValue(False); 
     $query->expects($this->at(3))->method('get_row')->will($this->returnValue($test_data); 
     $query->expects($this->at(4))->method('get_row')->will($this->returnValue(False); 
    } 
} 

동안 $ 루프 객체 -> mysql_fetch_assoc을 할 때 발생하는 것처럼 내가 부울 FALSE 값을 반환하고있어() queryDataSource : 나는 아래의 단순화 된 버전을 만들었습니다. 문제는 두 번째 쿼리를 실행하고 get_row()를 통해 데이터를 가져 오려고하면 mock 객체가 at (3) 지점으로 이동하는 것보다 FALSE ratehr을 계속 반환하는 것입니다. 이것은 4 개의 객체에서도 발생합니다. 첫 번째 객체는 반환 값으로 테스트 데이터를 가져오고 두 번째는 FALSE가되고, 다른 객체는 매번 FALSE가됩니다.

이 문제를 해결할 방법이 있는지 아는 사람이 있습니까? FALSE 플래그를 제거하고 at()에서 홀수 값을 갖기 위해 노력했지만 동일한 문제가 있었으며 (1-2)에 대한 데이터를 반환하는 데 시도했지만 단지 모든 데이터를 처음에는 루프이고 다른 하나는 루프가 아닙니다. 당신이 줄 수있는 모든 도움을

덕분에, 내가 이해 것만 의사 만에서 보낸 것으로 보인다 내가 코드를 실행할 수 없습니다

답변

7

충분히 명확 문제의 당신이 조롱하려고하는 것입니다 설명을 바란다 다음과 같이 다음 ->at() 정규의 숫자가 method 당하지만 object 당 포함되지 않는다는 것입니다으로

Call to query, get_row, get_row, query, get_row, get_row. 

문제는 당신이 실행 한 것으로 보인다.

그래서 당신은 아마 쓰고 싶은 것입니다 : 당신의 모의 객체와

$query->expects($this->at(0))->method('query'); 
    $query->expects($this->at(1))->method('get_row')->will($this->returnValue($test_data); 
    $query->expects($this->at(2))->method('get_row')->will($this->returnValue(False); 
    $query->expects($this->at(3))->method('query'); 
    $query->expects($this->at(4))->method('get_row')->will($this->returnValue($test_data); 
    $query->expects($this->at(5))->method('get_row')->will($this->returnValue(False); 

두 번째는 그 문제로 실행 :

$query->expects($this->any())->method('query'); 
    $query->expects($this->at(1))->method('get_row')->will($this->returnValue($test_data); 
    $query->expects($this->at(2))->method('get_row')->will($this->returnValue(False); 
    $query->expects($this->at(4))->method('get_row')->will($this->returnValue($test_data); 
    $query->expects($this->at(5))->method('get_row')->will($this->returnValue(False); 

또는 그것이 litte easer 어쩌면 읽을 수 있도록하기 위해 "query"에 대한 호출은 하나의 "call"을 세고 있었고 따라서 두 번째로 건너 뜁니다. return($test_data);.

+0

응답이 늦어서 미안해 다른 프로젝트로 옮겨졌지만 곧 돌아갈 수 있어야합니다. 이것은 문제가 될 수있는 것처럼 보입니다. 작동하는 경우 알려줍니다. – SolidSquid

+0

이 작업은 at()에 대한 인덱스가 메서드가 아니라 개체와 관련되어 있으므로 "쿼리"를 건너 뛴다고 생각했습니다. 프로세스의 일부. 또한 작동하지 않는 코드를 게시하지 않아서 죄송합니다. 그것은 내가 사용했던 코드를 기반으로하지만 단순화 된 버전으로 작성되었으며 – SolidSquid

1

불행히도 at()은 테스트를 구현에 매우 강력하게 바인딩합니다.

당신이 시험 방법 내부 2 메서드 호출을 재 배열 상상해, 기능은 정확히 동일하지만 같은 경우에 method doesn't exist at index N

등의 비밀 메시지를 자주 at() 지금 실패하여 모든 테스트는 당신이 원하는 구체적으로 말하면 "이것은 정확하게이 방식으로 호출 된 것입니다."라는 말은 훌륭합니다.하지만 PHPUnit 모의 확장 기능 중 하나가 좀 더 친숙한 것으로 보입니다. 특히 Mockery 및 가이드 here (믿을만한 것)

다른 또한.

+0

edorian의 솔루션을 게시하기 전에 테스트 할 기회가 없었지만 Mockery를 살펴보고 가능한지 확인할 것입니다. 익숙한. 이것에 유연성을 더하는 것이 유용 할 것입니다. 정보 주셔서 감사합니다 – SolidSquid

관련 문제