2009-08-12 5 views
9

필자는 수색했지만 찾고자하는 것이 무엇인지 찾을 수 없으며 매뉴얼은이 점에서별로 도움이되지 않습니다. 나는 단위 테스트에 상당히 익숙하기 때문에, 나는 올바른 방향에 있는지 잘 모르겠습니다. 어쨌든, 질문에.PHP 단위로 모의 객체 생성하기

<?php 
    class testClass { 
     public function doSomething($array_of_stuff) { 
      return AnotherClass::returnRandomElement($array_of_stuff); 
     } 
    } 
?> 

지금, 분명 내가 매번 같은 일을 반환 AnotherClass::returnRandomElement($array_of_stuff);를 원하는 : 나는 클래스가 있습니다. 제 질문은, 단위 테스트에서, 어떻게이 객체를 모형으로 만들지요?

AnotherClass을 테스트 파일의 맨 위에 추가하려고 시도했지만 AnotherClass을 테스트하려고 할 때 "클래스 재 명명 불가능"오류가 발생합니다.

나는 공장 클래스를 이해한다고 생각하지만이 인스턴스에서 어떻게 적용 할 지 확신 할 수 없다. 테스트 데이터가 포함 된 완전히 별개의 AnotherClass 클래스를 작성한 다음 Factory 클래스를 사용하여 실제 AnotherClass 대신로드 할 수 있습니까? 또는 공장 패턴을 빨간색 청어로 사용하고 있습니다. 설정() 함수에

$RedirectUtils_stub = $this->getMockForAbstractClass('RedirectUtils'); 

    $o1 = new stdClass(); 
    $o1->id = 2; 
    $o1->test_id = 2; 
    $o1->weight = 60; 
    $o1->data = "http://www.google.com/?ffdfd=fdfdfdfd?route=1"; 
    $RedirectUtils_stub->expects($this->any()) 
     ->method('chooseRandomRoot') 
     ->will($this->returnValue($o1)); 
    $RedirectUtils_stub->expects($this->any()) 
     ->method('decodeQueryString') 
     ->will($this->returnValue(array())); 

하지만, 이러한 스텁은 무시되고 나는 내가 잘못 뭔가, 또는 방법은 내가 접근하고있어 여부를 작동하지 않을 수 있습니다

나는이 시도 AnotherClass 방법.

도움말! 이것은 나를 미치게합니다.

답변

6

단위 테스트에서는 정적 데이터가 포함 된 '테스트'클래스를 만들고 테스트 된 클래스로 전달하려고합니다. 이렇게하면 테스트에서 변수가 제거됩니다. 당신이 정적 클래스를 사용하고 있기 때문에

class Factory{ 
    function build() 
    { 
     $reader = new reader(); 
     $test = new test($reader); 
     // ..... do stuff 
    } 

} 

class Factory{ 
    function build() 
    { 
     $reader = new reader_mock(); 
     $test = new test($reader); 
     // ..... do stuff 
    } 

} 
class reader_mock 
{ 
    function doStuff() 
    { 
     return true; 
    } 
} 

, 당신은 프로그램에서 AnotherClass을 제거하고, 다음은 테스트 데이터를 반환하는 함수를 포함하도록 다시 작성해야합니다. 일반적으로 프로그램에서 실제로 클래스를 제거하고 싶지는 않습니다. 위의 예제와 같이 클래스를 전달하는 이유입니다.

+0

훌륭하게 답변 해 주셔서 감사합니다. 하나의 질문. 그래서 저는 저에게 모든 인스턴스를 생성하는 Factory 클래스를 가지고 있습니다. 이것은 제작에 들어가는 수업입니다. mock 객체를이 클래스에 추가합니까, 아니면 기본 Factory Class를 프로덕션으로 남겨둔 다음 unittest에 대한 새 팩토리 클래스를 추가합니까? – Mike

+0

그게 전부 다. 테스트를 위해 새 팩토리 클래스를 만들거나 테스트 한 후에 팩토리 클래스를 정리할 수 있습니다. –